#include <stdio.h>
#define tempClassDef( num ) template<class T##num> struct tempClass##num { T##num m##num; }; \
template<> struct tempClass##num<void> { }
tempClassDef( 0 );
tempClassDef( 1 );
tempClassDef( 2 );
template<class T0, class T1=void, class T2=void>
struct MyTupple : tempClass0<T0>, tempClass1<T1>, tempClass2<T2>
{
public:
};
class A
{
public:
int m_Value;
A() : m_Value(0) { printf( "A\n" ); }
~A(){ printf( "~A\n" ); }
};
class B
{
public:
int m_Value;
B() : m_Value(1) { printf( "B\n" ); }
~B(){ printf( "~B\n" ); }
};
class C
{
public:
int m_Value;
C() : m_Value(2) { printf( "C\n" ); }
~C(){ printf( "~C\n" ); }
};
int main( void )
{
{
printf( "sizeof( MyTupple<A,B,C> ) = %d\n", sizeof(MyTupple<A,B,C>) );
MyTupple<A,B,C> myTupple;
printf( "%d, %d, %d\n", myTupple.m0.m_Value, myTupple.m1.m_Value, myTupple.m2.m_Value );
}
{
printf( "sizeof( MyTupple<C> ) = %d\n", sizeof(MyTupple<C>) );
MyTupple<C> myTupple;
printf( "%d\n", myTupple.m0.m_Value );
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIHRlbXBDbGFzc0RlZiggbnVtICkgdGVtcGxhdGU8Y2xhc3MgVCMjbnVtPiBzdHJ1Y3QgdGVtcENsYXNzIyNudW0gICAgICAgeyBUIyNudW0gbSMjbnVtOyB9OyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTw+ICAgICAgICAgICAgIHN0cnVjdCB0ZW1wQ2xhc3MjI251bTx2b2lkPiB7ICB9Cgp0ZW1wQ2xhc3NEZWYoIDAgKTsKdGVtcENsYXNzRGVmKCAxICk7CnRlbXBDbGFzc0RlZiggMiApOwoKdGVtcGxhdGU8Y2xhc3MgVDAsIGNsYXNzIFQxPXZvaWQsIGNsYXNzIFQyPXZvaWQ+CnN0cnVjdCBNeVR1cHBsZSA6IHRlbXBDbGFzczA8VDA+LCB0ZW1wQ2xhc3MxPFQxPiwgdGVtcENsYXNzMjxUMj4KewpwdWJsaWM6Cn07CgpjbGFzcyBBCnsKcHVibGljOgoJaW50IG1fVmFsdWU7CglBKCkgOiBtX1ZhbHVlKDApIHsgcHJpbnRmKCAiQVxuIiApOyB9Cgl+QSgpeyBwcmludGYoICJ+QVxuIiApOyB9Cn07CgpjbGFzcyBCCnsKcHVibGljOgoJaW50IG1fVmFsdWU7CglCKCkgOiBtX1ZhbHVlKDEpIHsgcHJpbnRmKCAiQlxuIiApOyB9Cgl+QigpeyBwcmludGYoICJ+QlxuIiApOyB9Cn07CgpjbGFzcyBDCnsKcHVibGljOgoJaW50IG1fVmFsdWU7CglDKCkgOiBtX1ZhbHVlKDIpIHsgcHJpbnRmKCAiQ1xuIiApOyB9Cgl+QygpeyBwcmludGYoICJ+Q1xuIiApOyB9Cn07CgppbnQgbWFpbiggdm9pZCApCnsKCXsKCQlwcmludGYoICJzaXplb2YoIE15VHVwcGxlPEEsQixDPiApID0gJWRcbiIsIHNpemVvZihNeVR1cHBsZTxBLEIsQz4pICk7CgkJTXlUdXBwbGU8QSxCLEM+IG15VHVwcGxlOwoJCXByaW50ZiggIiVkLCAlZCwgJWRcbiIsIG15VHVwcGxlLm0wLm1fVmFsdWUsIG15VHVwcGxlLm0xLm1fVmFsdWUsIG15VHVwcGxlLm0yLm1fVmFsdWUgKTsKCX0KCXsKCQlwcmludGYoICJzaXplb2YoIE15VHVwcGxlPEM+ICkgPSAlZFxuIiwgc2l6ZW9mKE15VHVwcGxlPEM+KSApOwoJCU15VHVwcGxlPEM+IG15VHVwcGxlOwoJCXByaW50ZiggIiVkXG4iLCBteVR1cHBsZS5tMC5tX1ZhbHVlICk7Cgl9CiAgICByZXR1cm4gMDsKfQ==