2013-03-04 87 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