On Dec 1, 3:16*pm, David Resnick <lndresn...@gmail.com> wrote:
> Given this code fragment:
>
> * * * * #define IFV(func, number) \
> * * * * incomingFunctVal<CVxicBridgedXferIncomingAction> val##number
> ( \
> * * * * * * number, &CVxicBridgedXferIncomingAction::func); \
> * * * * m_transFnMap.insert(fnMap::value_type(#func, val##number));
>
> * * * * IFV( DoJoin, 1 );
> * * * * IFV( DoJoinRestartReco, 2 );
> * * * * IFV( DummyAction, 3 );
> * * * * IFV( RestartReco, 4 );
> * * * * ....
> * * * * IFV( SomeFunc, 100 );
>
> I'm wondering if there is a way to have the numbers in the function
> macro increment automatically?
You could use __COUNTER__ macro. If it is supported by your compiler.
Otherwise, draw inspiration from boost preprocessor library:
http://www.boost.org/doc/libs/1_37_0...f/counter.html
> The code in the macro isn't really subject to change (it is the way to
> use a state machine
> implementation that I can't modify).
That's too bad, since such an interface is real pain.
I wonder why incomingFunctVal<> constructor needs that integer? If it
can be auto-generated (possibly in incomingFunctVal<> constructor) by
incrementing a global or class static variable, and if you don't
really need valN objects (their copies are stored in m_transFnMap
anyway) the macro could be simplified to:
typedef CVxicBridgedXferIncomingAction X; // for brevity
int x = 0; // the global counter
#define IFV(func) \
m_transFnMap.insert( \
fnMap::value_type( \
#func \
, incomingFunctVal<X>(++x, &X::func) \
) \
);
--
Max