🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: be.comp.programming
Article #3546

Re: [C++] preprocessor constructie - leuke implementatie van het Factory pattern

#3546
From: Stijn De Smet
Date: Mon, 01 Dec 2003 13:09
37 lines
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-mail
References: <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