9

私は C++ (11 ではない) を使用しており、整数データ型に対して異なる typedef を持ついくつかのライブラリを使用しています。2 つの typedef が同じ型であると断言できる方法はありますか? 私は自分で次の解決策を思いつきました..安全ですか?ありがとう

template<typename T>
struct TypeTest
{
    static void Compare(const TypeTest& other) {}
};

typedef unsigned long long UINT64;
typedef unsigned long long UINT_64;
typedef unsigned int UINT_32;

int main()
{
    TypeTest<UINT64>::Compare(TypeTest<UINT64>()); // pass
    TypeTest<UINT64>::Compare(TypeTest<UINT_64>()); // pass
    TypeTest<UINT64>::Compare(TypeTest<UINT_32>()); // fail
}
4

3 に答える 3

27

C++11 では、 を使用できますstd::is_same<T,U>::value

C++11 を持っていないので、この機能を自分で次のように実装できます。

template<typename T, typename U>
struct is_same 
{
    static const bool value = false; 
};

template<typename T>
struct is_same<T,T>  //specialization
{ 
   static const bool value = true; 
};

終わり!

static_assert同様に、次のように1を実装できます。

template<bool> struct static_assert;
template<> struct static_assert<true> {};  //specialization

これで、次のように使用できます。

static_assert<is_same<UINT64,UINT64>::value>(); //pass
static_assert<is_same<UINT64,UINT32>::value>(); //fail

または、これをマクロで次のようにラップすることもできます。

#define STATIC_ASSERT(x)  { static_assert<x> static_assert_failed; (void) static_assert_failed; }

次に、次のように使用します。

STATIC_ASSERT(is_same<UINT64,UINT64>::value); //pass
STATIC_ASSERT(is_same<UINT64,UINT32>::value); //pass

マクロを使用すると、アサートが失敗した場合にコンパイラが生成するメッセージに次の文字列が表示されます。

static_assert_failed

これは役に立ちます。エラー メッセージのその他の情報を使用すると、エラーが発生した理由を突き止めることができます。

それが役立つことを願っています。


1. C++11 では、static_assertは演算子 (コンパイル時に動作する) であり、クラス テンプレートではないことに注意してください。上記のコードでstatic_assertは、 はクラス テンプレートです。

于 2013-03-04T11:39:13.910 に答える
3

C++11 を持っていないので、boost を使用します。

BOOST_STATIC_ASSERT(boost::is_same<T, U>::value);

の代わりに、何らかのアサート関数を書くことができますBOOST_STATIC_ASSERT

于 2013-03-04T11:34:02.330 に答える
1

std::type_info が役立つかもしれません。

于 2013-03-04T11:37:02.407 に答える