2013-03-04 112 views
-1

我正在使用一些對整數類型有自己的定義的庫。我如何檢查兩個typedefs是否適用於相同的類型?我問另一個問題如何檢查兩個typedef是相同的。但是,假設int和long int在我的編譯器上都是32位的,並且兩個庫可能會使用它們。我想檢查報告int的int typedef和long int的typedef對於這個編譯器是相同的(可能不適用於另一個)。謝謝。如何檢查兩個整數typedefs是否相等?

這與其他問題不一樣。對另一個問題的解決方案有(int)和(long int)檢查失敗,即使兩者都是32位。現在我想讓他們通過檢查。

我沒有使用C++ 11。

+0

-1 - >您已經問過這個問題 - http://stackoverflow.com/questions/15200516/compare-typedef-is-same-type – 2013-03-04 13:49:36

+0

不,我沒有。閱讀第一個答案的評論。 – 2013-03-04 13:55:30

+0

@Ed這不是同一個問題。即使兩者都是64位有符號的,is_same也會在很長很長的時間內返回false。 – us2012 2013-03-04 13:56:54

回答

0

我自己想出了這個解決方案。我現在只關心整數,但是更通用的解決方案將不勝感激。任何反饋?謝謝。

#include <limits> 

using namespace std; 

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

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

#define CHECK_INTEGER_TYPES(T, U) (numeric_limits<T>::is_specialized && numeric_limits<U>::is_specialized && numeric_limits<T>::is_integer && numeric_limits<U>::is_integer && (numeric_limits<T>::is_signed == numeric_limits<U>::is_signed) && (numeric_limits<T>::digits == numeric_limits<U>::digits)) 

int main() 
{ 
    static_assert<(CHECK_INTEGER_TYPES(UINT64, UINT_64))>(); // pass 
    static_assert<CHECK_INTEGER_TYPES(UINT64, UINT64)>(); // pass 
    static_assert<CHECK_INTEGER_TYPES(UINT64, UINT_32)>(); // fail 
    static_assert<CHECK_INTEGER_TYPES(UINT32, UINT32)>(); // pass 
    static_assert<CHECK_INTEGER_TYPES(UINT32, UINT_32)>(); // pass 
} 
+0

你可能想在那裏拋出'std :: is_convertible(T,U):: value'和'std :: is_convertible(U,T):: value' – 2013-03-04 14:10:27

+0

@StephenLin,他沒有使用C++ 11 – 2013-03-04 14:10:49

+0

@ JonathanWakely啊,錯過了那部分......好吧,對於任何閱讀OP以外的人來說,如果他們堅持檢查這樣的東西,這是很好的建議 – 2013-03-04 14:11:50