NoSenseEtAl NoSenseEtAl - 1 month ago 11x
C++ Question

How to check if two types are same at compiletime(bonus points if it works with Boost strong typedef)

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>
template<typename T, typename U>
static constexpr void __help()
template<typename T, typename U>
class AreSameType
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


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 :))?


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 };