Подтвердить что ты не робот

Как проверить, являются ли два типа одинаковыми в compiletime (бонусные баллы, если он работает с Boost strong typedef)

Мне было интересно, можно ли проверить, являются ли 2 типа одинаковыми во время компиляции. То, что я придумал, это (idk, если он работает, потому что он чувствует себя хакерским и стандартным IDK, что хорошо, поэтому IDK, что искать при тестировании).

#include <boost/strong_typedef.hpp>
BOOST_STRONG_TYPEDEF(double, cm);
BOOST_STRONG_TYPEDEF(double, inch);
template<typename T, typename U>
static constexpr void __help() 
{
}
template<typename T, typename U>
class AreSameType
{
    public:
    constexpr operator bool()
    {
     return &__help<T,U> == &__help<U,T>;
    };
};

использование:

int main()
{
        static_assert(AreSameType<double,float>()== false, "oh noes1");
        static_assert(AreSameType<double,double>()== true, "oh noes2");
        static_assert(AreSameType<int*,double*>()== false, "oh noes3");
        static_assert(AreSameType<double*,double>()== false, "oh noes4");
        static_assert(AreSameType<const double,double>()== false, "oh noes5");
        static_assert(AreSameType<inch,cm>()== true, "oh expected"); //fires
}

So

1) есть ли лучший способ?
2) это адрес функции hack, гарантированной работой по стандарту (я бы поставил не:))?

4b9b3361

Ответ 1

Используйте std::is_same. std::is_same<T,U>::value будет истинным, если T и U являются одним и тем же типом, иначе false.

Если у вас нет С++ 11, его легко реализовать как это

template<class T, class U>
struct is_same {
    enum { value = 0 };
};

template<class T>
struct is_same<T, T> {
    enum { value = 1 };
};