Listing 8

// Compile-time selection (lazy referencing of template members)

// reference T::result only
template <bool b , typename T , typename F>
struct If
{
    typedef typename T::result result;
};
// reference F::result only
template <typename T , typename F>
struct If <false , T , F>
{
    typedef typename F::result result;
};
If <  false , 
       A<T1>, 
       B<T1>  >::result  foo;