    #include <stdio.h>
    #include <type_traits>
    #include <typeinfo>

    struct Base {};
    struct OfBase: public Base {};
    struct NotBase {};
    template <typename T1, typename T2, typename = void>
    struct select_base
    {
        typedef T1 type;
    };
    template <typename T1, typename T2>
    struct select_base<T1, T2, typename std::enable_if<
        std::is_base_of<Base, T2>::value, T2>::type>
    {
        typedef T2 type;
    };
    int main()
    {
       printf("Expected OfBase: %s\n", typeid(typename select_base<NotBase, OfBase>::type).name());
       printf("Expected OfBase: %s\n", typeid(typename select_base<OfBase, NotBase>::type).name());
       return 0;
    }