Article View: be.comp.programming
Article #3546Re: [C++] preprocessor constructie - leuke implementatie van het Factory pattern
From: 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
Technical Details
Message-ID:
<bqfcv7$oj8$1@gaudi2.UGent.be>Path:
arc1-ca.pugleaf.net!archiver1.google.com!news2.google.com!news.maxwell.syr.edu!newsgate.cistron.nl!aotearoa.belnet.be!news.belnet.be!news.UGent.be!not-for-mailReferences:
<Xns944376DA741F0jeroenhaegebaerthotm@195.121.6.83>Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit X-Google-Thread: fcea4,541b3c0d783254aa X-Google-Attributes: gidfcea4,public X-Google-ArrivalTime: 2003-12-01 05:13:14 PST Path: arc1-ca.pugleaf.net!archiver1.google.com!news2.google.com!news.maxwell.syr.edu!newsgate.cistron.nl!aotearoa.belnet.be!news.belnet.be!news.UGent.be!not-for-mail From: Stijn De Smet <stijn.desmet@nospammer.pandora.be> Newsgroups: be.comp.programming Subject: Re: [C++] preprocessor constructie - leuke implementatie van het Factory pattern Date: Mon, 01 Dec 2003 14:09:30 +0100 Organization: Ghent University Lines: 37 Message-ID: <bqfcv7$oj8$1@gaudi2.UGent.be> References: <Xns944376DA741F0jeroenhaegebaerthotm@195.121.6.83> Reply-To: stijn.desmet@nospammer.pandora.be NNTP-Posting-Host: azimov.intec.ugent.be Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7Bit X-Trace: gaudi2.UGent.be 1070282535 25192 157.193.122.169 (1 Dec 2003 12:42:15 GMT) X-Complaints-To: helpdesk@dict.ugent.be NNTP-Posting-Date: Mon, 1 Dec 2003 12:42:15 +0000 (UTC) User-Agent: KNode/0.7.2