How to check if two types are same at compiletime(bonus points if it works with Boost strong typedef)
c++, c++11, constexpr, static-assert, template-meta-programming
Solution
Use `std::is_same`. `std::is_same<T,U>::value` will be true if T and U are the same type, false otherwise.
If you don't have C++11, it's easy to implement as this
template<class T, class U>
struct is_same {
enum { value = 0 };
};
template<class T>
struct is_same<T, T> {
enum { value = 1 };
};
Problem
I was wondering if it is possible to check if 2 types are same at compile time. What I came up with is(idk if it works because it feels hackish and IDK standard that good so IDK what to look for when testing). ``` #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>; }; }; ``` usage : ``` 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) is there a better way to it? 2) is this address of a function hack guaranteed to work by standard(I would bet not :))?