2013-03-04 63 views
8

我正在使用C++(而不是11),並使用一些庫具有不同typedefs整數數據類型。有什麼辦法可以斷言兩個typedefs是相同的類型?我自己想出了以下解決方案。是否安全? 謝謝比較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 2013-03-04 11:32:43

回答

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 爲:

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是一個類模板。

+0

嗨。我試圖在VS2008上的解決方案,但行模板 static_assert給出錯誤: 錯誤C4430:缺少類型說明符 - 假定爲int。注意:C++不支持default-int 錯誤C2998:'int static_assert':不能作爲模板定義 – 2013-03-04 11:49:40

+0

@NeilKirk:糟糕。我在'static_assert'的定義中忘記了'struct'。現在修復它。 – Nawaz 2013-03-04 11:50:26

+0

說UINT32可以定義爲unsigned int或unsigned long int。這些比較你的代碼中是否相同?謝謝。 – 2013-03-04 12:02:33

3

由於您沒有C++ 11,請使用boost。

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

你可以寫一些你的斷言函數,而不是BOOST_STATIC_ASSERT

+0

雖然您已經使用boost,但將運行時斷言'編譯時'BOOST_STATIC_ASSERT'。 – 2013-03-04 11:37:10

+0

@MichaelWild,斷言不是C斷言,它是某種你的斷言函數。 – ForEveR 2013-03-04 11:41:19

+2

這是無關緊要的。重要的是,OP可能希望'assert'在編譯期間通過/失敗,而不是在運行時。 – 2013-03-04 11:51:34

1

std :: type_info可能會幫助你。

+0

這是C++ 11 ... – 2013-03-04 11:54:54

+0

@MichaelWild:根據[this](http://www.cplusplus.com/reference/typeinfo/type_info/)頁面,它不是C++ 11規範。我對嗎 ? – Kamouth 2013-03-04 11:57:48

+0

對不起,我把它與''頭混淆。 – 2013-03-04 12:02:16