c++ c++11 template-meta-programming constexpr static-assert

c++ - Cómo verificar si dos tipos son iguales en tiempo de compilación(puntos de bonificación si funciona con Boost strong typedef)



c++11 template-meta-programming (1)

Utilice std::is_same . std::is_same<T,U>::value será verdadero si T y U son del mismo tipo, falso de lo contrario.

Si no tiene C ++ 11, es fácil de implementar ya que esto

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

Me preguntaba si es posible verificar si 2 tipos son iguales en el momento de la compilación. Lo que se me ocurrió es (idk si funciona porque se siente hackish y el estándar IDK es muy bueno, así que IDK qué buscar durante las pruebas)

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

uso:

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 }

Asi que

1) ¿Hay una mejor manera de hacerlo?
2) ¿se garantiza que esta dirección de una función hack funcionará según el estándar (apostaría que no :))?