Как проверить, совпадают ли два типа во время компиляции (бонусные баллы, если он работает с 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
}

Так

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

22

Решение

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

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

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

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

Другие решения

Других решений пока нет …