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