Thread View: be.comp.programming
2 messages
2 total messages
Started by Jeroen Haegebaert
Sun, 30 Nov 2003 10:44
[C++] preprocessor constructie - leuke implementatie van het Factory pattern
Author: Jeroen Haegebaert
Date: Sun, 30 Nov 2003 10:44
Date: Sun, 30 Nov 2003 10:44
25 lines
1851 bytes
1851 bytes
Ik ben net een generieke templated implementatie van het Factory pattern aan het bekijken, gevonden op http://www.codeguru.com/mfc/comments/40081.shtml Er wordt de volgende preprocessor constructie gebruikt: // macros used for generating a unique identifier. #define CAT4(a,b,c,d) CAT4_DELAY(a,b,c,d) #define CAT4_DELAY(a,b,c,d) DO_CAT4(a,b,c,d) #define DO_CAT4(a,b,c,d) a##b##c##d // macro for registering class. #define REGISTER_CLASS(name, ClassT, BaseT) \ Factory<BaseT *>::Creator<ClassT> \ CAT4(_the_creator,ClassT,_,__LINE__)(name) De REGISTER_CLASS macro maakt dus een factory aan voor het type ClassT, derived van BaseT. De CAT4 macro maakt voor die factory een unieke naam aan. Tot zover ben ik mee. Kan iemand mij echter uitleggen hoe die preprocessor constructie juist werkt ? Waarom gebeurt die CAT4 macro in 3 stappen ? jeroen
Re: [C++] preprocessor constructie - leuke implementatie van het Factory pattern
Author: Stijn De Smet
Date: Mon, 01 Dec 2003 13:09
Date: Mon, 01 Dec 2003 13:09
37 lines
2548 bytes
2548 bytes
Jeroen Haegebaert wrote: > Ik ben net een generieke templated implementatie van het Factory pattern > aan het bekijken, gevonden op > http://www.codeguru.com/mfc/comments/40081.shtml > > Er wordt de volgende preprocessor constructie gebruikt: > > // macros used for generating a unique identifier. > #define CAT4(a,b,c,d) CAT4_DELAY(a,b,c,d) > #define CAT4_DELAY(a,b,c,d) DO_CAT4(a,b,c,d) > #define DO_CAT4(a,b,c,d) a##b##c##d > > // macro for registering class. > #define REGISTER_CLASS(name, ClassT, BaseT) \ > Factory<BaseT *>::Creator<ClassT> \ > CAT4(_the_creator,ClassT,_,__LINE__)(name) > > > De REGISTER_CLASS macro maakt dus een factory aan voor het type ClassT, > derived van BaseT. De CAT4 macro maakt voor die factory een unieke naam > aan. Tot zover ben ik mee. > > Kan iemand mij echter uitleggen hoe die preprocessor constructie juist > werkt ? Waarom gebeurt die CAT4 macro in 3 stappen ? > #define CAT4(a,b,c,d) CAT4_DELAY(a,b,c,d) #define CAT4_DELAY(a,b,c,d) a##b##c##d Imho is dat voldoende. De 2 macro's zijn noodzakelijk, aangezien elders in de code __LINE__ gebruikt wordt. Macro's voeren hun argumenten uit tenzij er een string concat in de macro voorkomt. Dus moest CAT4 metteen a##b##c##d uitvoeren, dan zou er __LINE__ letterlijk staan, en niet het lijnnummer. Als er nog de tussenstap van de tweede macro is, dan wordt __LINE__ al uitgevoerd voordat de string concat gedaan wordt. -- Stijn De Smet
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads