#include <iostream>
#include <typeinfo>

using namespace std;

template<typename FalseType, typename TrueType, bool condition>
struct ConditionalTypeSelector
{
    typedef void ResultType;
};

template<typename FalseType, typename TrueType>
struct ConditionalTypeSelector<FalseType,TrueType,false>
{
    typedef FalseType ResultType;
};

template<typename FalseType, typename TrueType>
struct ConditionalTypeSelector<FalseType,TrueType,true>
{
    typedef TrueType ResultType;
};

struct A {
    unsigned char member;
};

struct B {
    int member;
};

struct C {
    long long member;
};

int main() {
    cout << typeid
                ( ConditionalTypeSelector
                      < A,B,(sizeof(A) > sizeof(B))
                      >::ResultType
                ).name() << endl;
    cout << typeid
                ( ConditionalTypeSelector
                      < A,B,(sizeof(B) > sizeof(A))
                      >::ResultType
                ).name() << endl;

    cout << typeid
                ( ConditionalTypeSelector
                      < A,C,(sizeof(A) > sizeof(C))
                      >::ResultType
                ).name() << endl;

    cout << typeid
                ( ConditionalTypeSelector
                      < C,B,true>::ResultType
                ).name() << endl;

    cout << typeid
                ( ConditionalTypeSelector
                      < C,A,false>::ResultType
                ).name() << endl;

    return 0;
}
