I hate to bump this, but I wanted to post the resolution I came to.
I decided to look down the road of macros to generate my read function. Which turned out to be significantly more tricky than I anticipated.
I wanted syntax like...
class Foo : Synchronizable
{
Attribute <float> Value;
Attribute <Vector2> Position;
Attribute <int> Count;
public:
Attributes (Value,Position,Count);
};
Which the "Attributes" macro, expands to..
void Read () { Value.Read (); Position.Read (); Count.Read (); }
This required using variable arguments for a macro and some shenanigans to iterate through them, that I pulled from a macro implementation of __VA_NARG__. Which incidentally didn't work in VS2010... After fixing that I found
http://stackoverflow...variadic-macros which also didn't work in VS2010 without improvement.
It's rather large since I wanted support for 32 attributes, it still requires more work to handle calling the base class's Read (). But I wanted to post it in case anyone found it worth while.
#pragma once
#define Attributes(...) \
void Read ()\
{\
ITERATE_LIST(ATTRIBUTE,__VA_ARGS__)\
}\
#define ATTRIBUTE(X) X.Read ();
#define STRINGIFY(X) STRINGIFY_(X)
#define STRINGIFY_(X) STRINGIFY__(X)
#define STRINGIFY__(X) #X
#define CONCATENATE(arg1, arg2) CONCATENATE1(arg1, arg2)
#define CONCATENATE1(arg1, arg2) CONCATENATE2(arg1, arg2)
#define CONCATENATE2(arg1, arg2) arg1##arg2
#define EXPAND(X) EXPAND_(X)
#define EXPAND_(X) EXPAND__(X)
#define EXPAND__(X) X
#define SYNC_NARG(...)\
EXPAND (SYNC_ARG_N(__VA_ARGS__,31,30,29,28,27,26,25,24,23,22,21,19,18,17,16,15,14,113,12,11,10,9,8,7,6,5,4,3,2,1,0))
#define SYNC_ARG_N(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,N,...) N
#define SYNC_RSEQ_N 32,31,30,29,28,27,26,25,24,23,22,21,19,18,17,16,15,14,113,12,11,10,9,8,7,6,5,4,3,2,1,0
#define ITERATE_LIST(macro, ...) ITERATE_LIST__(SYNC_NARG(element,__VA_ARGS__), macro,__VA_ARGS__)
#define ITERATE_LIST__(N,macro, ...) EXPAND(CONCATENATE(ITERATE_LIST_,N)(macro,__VA_ARGS__))
#define ITERATE_LIST_1(macro, element) macro(element)
#define ITERATE_LIST_2(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_1(macro, __VA_ARGS__))
#define ITERATE_LIST_3(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_2(macro, __VA_ARGS__))
#define ITERATE_LIST_4(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_3(macro, __VA_ARGS__))
#define ITERATE_LIST_5(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_4(macro, __VA_ARGS__))
#define ITERATE_LIST_6(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_5(macro, __VA_ARGS__))
#define ITERATE_LIST_7(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_6(macro, __VA_ARGS__))
#define ITERATE_LIST_8(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_7(macro, __VA_ARGS__))
#define ITERATE_LIST_9(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_8(macro, __VA_ARGS__))
#define ITERATE_LIST_10(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_9(macro, __VA_ARGS__))
#define ITERATE_LIST_11(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_10(macro, __VA_ARGS__))
#define ITERATE_LIST_12(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_11(macro, __VA_ARGS__))
#define ITERATE_LIST_13(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_12(macro, __VA_ARGS__))
#define ITERATE_LIST_14(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_13(macro, __VA_ARGS__))
#define ITERATE_LIST_15(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_14(macro, __VA_ARGS__))
#define ITERATE_LIST_16(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_15(macro, __VA_ARGS__))
#define ITERATE_LIST_17(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_16(macro, __VA_ARGS__))
#define ITERATE_LIST_18(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_17(macro, __VA_ARGS__))
#define ITERATE_LIST_19(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_18(macro, __VA_ARGS__))
#define ITERATE_LIST_20(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_19(macro, __VA_ARGS__))
#define ITERATE_LIST_21(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_20(macro, __VA_ARGS__))
#define ITERATE_LIST_22(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_21(macro, __VA_ARGS__))
#define ITERATE_LIST_23(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_22(macro, __VA_ARGS__))
#define ITERATE_LIST_24(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_23(macro, __VA_ARGS__))
#define ITERATE_LIST_25(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_24(macro, __VA_ARGS__))
#define ITERATE_LIST_26(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_25(macro, __VA_ARGS__))
#define ITERATE_LIST_27(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_26(macro, __VA_ARGS__))
#define ITERATE_LIST_28(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_27(macro, __VA_ARGS__))
#define ITERATE_LIST_29(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_28(macro, __VA_ARGS__))
#define ITERATE_LIST_30(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_29(macro, __VA_ARGS__))
#define ITERATE_LIST_31(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_30(macro, __VA_ARGS__))
#define ITERATE_LIST_32(macro, element, ...) \
macro (element) \
EXPAND(ITERATE_LIST_31(macro, __VA_ARGS__))