struct DefaultType{}; template struct Holder { Holder(); Holder(const Holder&); }; template int check_type( Holder a=Holder(), Holder b=Holder(), Holder c=Holder(), Holder d=Holder(), Holder e=Holder() ); template< class T1=DefaultType, class T2=DefaultType, class T3=DefaultType, class T4=DefaultType, class T5=DefaultType> struct CommonType { enum { Check = sizeof( check_type( Holder(), Holder(), Holder(), Holder() ) ) }; typedef T1 Type; }; template struct CommonType { enum { Check = sizeof( check_type( Holder(), Holder(), Holder() ) ) }; typedef T2 Type; }; template struct CommonType { enum { Check = sizeof( check_type( Holder(), Holder() ) ) }; typedef T3 Type; }; template struct CommonType { enum { Check = sizeof( check_type( Holder() ) ) }; typedef T4 Type; }; template struct CommonType { typedef T5 Type; }; template<> struct CommonType<> { typedef DefaultType Type; };