🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#3671
Author: Jeroen Haegebaert
Date: Sun, 30 Nov 2003 10:44
25 lines
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
#3546
Author: 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
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