2013-03-04 9 views
8

私はC++(11ではなく)を使用しており、整数データ型に異なる型定義を持つライブラリを使用しています。 2つのtypedefが同じ型であると私が主張できる方法はありますか?私は以下の解決方法を思いつきました。それは安全ですか? ありがとう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 
} 
+2

cppreferenceは 'std :: is_same'のサンプル実装を持っています:http://en.cppreference.com/w/cpp/types/is_same – us2012

答えて

24

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<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; } 
今、あなたのようにそれらを使用することができ

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

同様に、あなたはようstatic_assert を実装することができます

として使用:

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がクラステンプレートです。

+0

こんにちは。 VS2008であなたのソリューションを試していますが、ラインテンプレート static_assertにエラーがあります。 エラーC4430:型指定子がない - 想定されています。注:C++はdefault-intをサポートしていません エラーC2998: 'int static_assert':テンプレート定義にすることはできません –

+0

@NeilKirk:おっと。 'static_assert'の定義で' struct'を忘れました。今すぐ修正しました。 – Nawaz

+0

UINT32をunsigned intまたはunsigned long intに定義できるとします。これらはあなたのコードで同じものを比較しますか?ありがとう。 –

3

あなたはC++ 11がないので、boostを使用してください。

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

BOOST_STATIC_ASSERTではなく、何らかのアサート機能を記述することができます。

+0

すでにブーストを使用している間は、実行時の' assertコンパイル時に 'BOOST_STATIC_ASSERT'を実行します。 –

+0

@MichaelWild、assertはC assertではありません。あなたのアサート関数のようなものです。 – ForEveR

+2

これは無関係です。重要なことは、OPは実行時ではなく、コンパイル時に 'assert'が合格/不合格になることを望んでいる可能性があります。 –

1

std :: type_infoが役立ちます。

+0

これはC++ 11です... –

+0

@MichaelWild:[this](http://www.cplusplus.com/reference/typeinfo/type_info/)ページによると、C++ 11の仕様ではありません。私は正しい? – Kamouth

+0

申し訳ありませんが、私はそれを ''ヘッダーと混同しました。 –

関連する問題