编译时检查变量是否为 signed/unsigned
Compile-time check that a variable is signed/unsigned
我正在尝试提出一些编译时方法来检查某个变量是有符号的还是无符号的。实际上,我使用下面的宏有一段时间来检查有符号变量:
#ifdef _DEBUG
#define CHECK_SIGNED(v) if((v) == -(v)){}
#else
#define CHECK_SIGNED(v)
#endif
然后以下将通过它:
INT rr = 0;
CHECK_SIGNED(rr);
而以下内容:
UINT rr = 0;
CHECK_SIGNED(rr);
会产生编译时错误:
error C4146: unary minus operator applied to unsigned type, result
still unsigned
所以现在我正在尝试对 unsigned
变量进行类似的检查。有什么建议吗?
PS。虽然我使用的是 VS 2017
,但最好让它向后兼容旧的 C++ 标准。
可以这样使用:
static_assert(std::is_signed<decltype(rr)>::value, "Not signed number");
和姐妹版std::is_unsigned
此外,为了支持旧编译器,您自己实现这些并不难。
我正在尝试提出一些编译时方法来检查某个变量是有符号的还是无符号的。实际上,我使用下面的宏有一段时间来检查有符号变量:
#ifdef _DEBUG
#define CHECK_SIGNED(v) if((v) == -(v)){}
#else
#define CHECK_SIGNED(v)
#endif
然后以下将通过它:
INT rr = 0;
CHECK_SIGNED(rr);
而以下内容:
UINT rr = 0;
CHECK_SIGNED(rr);
会产生编译时错误:
error C4146: unary minus operator applied to unsigned type, result still unsigned
所以现在我正在尝试对 unsigned
变量进行类似的检查。有什么建议吗?
PS。虽然我使用的是 VS 2017
,但最好让它向后兼容旧的 C++ 标准。
可以这样使用:
static_assert(std::is_signed<decltype(rr)>::value, "Not signed number");
和姐妹版std::is_unsigned
此外,为了支持旧编译器,您自己实现这些并不难。