Search code examples
c++templatescompile-time

compile-time function for checking type equality


I need to implement self contained compile-time function for checking type equality (function template without arguments bool eqTypes<T,S>()).

self contained means not relying on library.

I'm not good in all this. That's what I tried, but it's not what I need.

template<typename T>
bool eq_types(T const&, T const&) { 
return true;
}

template<typename T, typename U> 
bool eq_types(T const&, U const&) { 
return false; 
}

Solution

  • It's quite simple. Just define a type trait and a helper function:

    template<typename T, typename U>
    struct is_same
    {
        static const bool value = false;
    };
    
    template<typename T>
    struct is_same<T, T>
    {
        static const bool value = true;
    };
    
    template<typename T, typename U>
    bool eqTypes() { return is_same<T, U>::value; }
    

    Here is a live example.

    In C++11, if you are allowed to use std::false_type and std::true_type, you would rewrite the above this way:

    #include <type_traits>
    
    template<typename T, typename U>
    struct is_same : std::false_type { };
    
    template<typename T>
    struct is_same<T, T> : std::true_type { };
    
    template<typename T, typename U>
    constexpr bool eqTypes() { return is_same<T, U>::value; }
    

    Notice, that the type trait std::is_same, which does pretty much the same thing, is available as part of the Standard Library.