如何检查两个整数类型是否相等

How to check that two integer typedefs are equivalent?

本文关键字:类型 整数 两个 是否 何检查 检查      更新时间:2023-10-16

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

这和另一个问题不一样。另一个问题的解决方案是(int)和(long int)无法通过检查,即使它们都是32位的。现在我想让他们通过这张支票。

我自己想出了这个解决方案。我现在只关心整数,但更通用的解决方案将受到赞赏。任何的反馈吗?谢谢。

#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
}