template class ParamObject { public: void *parent; virtual void ToFile ( FILE *dest ) { fwrite ( (char*)this - sizeof(T), sizeof(T),1, dest ); } }; #define PARAM(TYPE,NAME) union { TYPE NAME; struct { TYPE NAME##alias; ParamObject NAME##object; }; }; class AClass { public: int a,b; };{ TYPE NAME##alias; ParamObject NAME##object; }; }; void test ( ) { struct { PARAM(float,time); PARAM(float,time2); PARAM(AClass,time3); }s; s.time = 23.0f; s.timeobject.ToFile ( 0 ); s.time3.a = 3; s.time2 += s.time; s.time3object.ToFile ( 0 ); }