如何定义类型uintptr
,以便它至少可以容纳uint32_t
和uintptr_t
,而无需使用并集?
在预处理器中允许sizeof()
,将完成我想要的操作:
#include <inttypes.h>
#if sizeof(uint32_t) > sizeof(uintptr_t) // unlikely, but the standard allows it
typedef uint32_t uintptr;
#else
typedef uintptr_t uintptr;
#endif
顾名思义,假定为x86_64系统,uintptr_t将至少已包含uint32_t。在x86上,它将是uint32_t,而在x64上,它将是uint64_t。
不需要预处理器获得这样的别名。在C ++ 17中,它很简单:
template<typename A, typename B>
auto larger_type() {
if constexpr (sizeof(A) > sizeof(B))
return A{};
else
return B{};
}
using uintptr = decltype(larger_type<uint32_t, uintptr_t>());