Thanks for the comments. I am still hesitating about some of the names and APIs. The library is pre-version 1.0.0, and it's the time to get things right. I am still hesitating about the syntax for defining a method (overridern). I could easily support: // no return type here // ---------V YOMM2_BEGIN(kick, (Dog& dog)) { return "bark"; } YOMM2_END; It breaks the symmetry with YOMM2_DECLARE though. Now onto your points...
- I feel like it should be possible to get rid of YOMM2_END by moving the function body out-of-line or using a lambda or something.
Of course I would like to get rid of YOMM2_END, but I haven't yet found a way of doing that that also ensures that the body of the method can be inlined inside the wrapper that casts the virtual arguments. I trie with lambdas to back in 2014. Then maybe I've overlooked something, if you have an idea...
- The documentation isn't clear on how the one-definition-rule applies (unless I missed it). My default assumption would be that YOMM2_DEFINE for a given overload should appear in exactly one translation unit, and that YOMM2_DECLARE and YOMM2_CLASS may appear in multiple translation units so long as the declarations are identical, but I notice that they're /all/ using unnamed namespaces. All of your examples only use a single source file, so I can't really guess your intentions from usage either.
Indeed I should be more explicit about this. As you guessed, YOMM2_DECLARE should go is header file worthy - it just defines an inline function and delcares a hidden function that is just used to guide the overload resolution. YOMM2_DEFINE is for *defintions* and as such only one is allowed per process; they're for .cpp files. YOMM2_CLASS is borderline. Normally it should be called once, whereever that happens - but it tolerates being called any number of times. That's for coping with situations where the same class may have several associated type_info objects - what I have in mind here is dynamically loaded Windows DLLs. I will improve the documentation...
- I'm curious why I would ever want to use the "cute" names when they're actually longer than the YOMM2 names.
I would use them ;-) They're more readable, and no uppercase loud. YOMM2 is an obscure acronym (Yorel's Open Multi Methods) that I picked to avoid name clashes. Lowercase names look more like keyworks. But indeed maybe I should write the entire doc and examples in terms of YOMM2* macros and de-emphasize the "cute" macros. J-L