Listing 7

// 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;