コンパイル時に2つの型が同じかどうかを確認できるかどうか疑問に思っていました。私が思いついたのは(ハックっぽい感じがするのでうまくいくかどうか、そして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)関数ハックのこのアドレスは、標準で動作することが保証されていますか(私はそうではないでしょう:))?