0

我正在使用一些对整数类型有自己定义的库。如何检查两个 typedef 是否用于等效类型?我在另一个问题中问如何检查两个 typedef 是否相同。但是,假设 int 和 long int 在我的编译器上都是 32 位的,并且两个库可能会使用它们。我希望检查报告 int 的 typedef 和 long int 的 typedef 对于这个编译器是相同的(可能不是另一个)。谢谢。

这与另一个问题不同。另一个问题的解决方案是 (int) 和 (long int) 未能通过检查,即使两者都是 32 位的。现在我希望他们通过检查。

我没有使用 C++11。

4

1 回答 1

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
}
于 2013-03-04T14:04:16.840 回答