web-dev-qa-db-ja.com

コンパイル時に2つのタイプが同じかどうかを確認する方法(Boost strong typedefで動作する場合のボーナスポイント)

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

25
NoSenseEtAl

使用する std::is_samestd::is_same<T,U>::value TとUが同じタイプの場合はtrue、それ以外の場合はfalseになります。

C++ 11をお持ちでない場合は、次のように簡単に実装できます。

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

template<class T>
struct is_same<T, T> {
    enum { value = 1 };
};
48
Dirk Holsopple