// Using If_else<> to choose a type
// check if T's size is less than 2 bytes
template <typename T>
struct isSmall
{
enum { result = (sizeof(T) <2) };
};
template <typename T> class A { typedef ... result; };
template <typename T> class B { typedef ... result; };
// foo is of either of type A<T1>:: result or B<T1>::result
If_else < isSmall< T1 >::result ,
A<T1>::result ,
B<T1>:: result >::result foo;