【发布时间】:2014-11-20 18:57:36
【问题描述】:
我正在尝试创建一个静态断言其参数是严格正整数的宏。这适用于我的许多其他遗留宏,到目前为止,这些宏只是假设没有任何检查其参数的完整性。
简而言之,如果我有如下条目,我希望 static_assert 通过:
“4”、“24”、“42324”等,
如果参数是这样的,我希望 static_assert 失败
“4.0”、“3.00”、“2.99”、“3.01”、“-5”、“45n3mn”、“0”、“01”、“002”等,以及空条目
基本上,只有当宏中的参数是一个干净的整数字符串时,我才希望断言通过,我通过以下“算法”来做到这一点:
(1) 如果字符串化参数不只是数字,则失败
(2) 如果第一个字符为 '0',则失败
(3) 如果为空,则失败
以下是我目前拥有的,但由于错误“C2057:预期的常量表达式”而无法编译(我正在使用 MSVS2013,但也想构建 g++ 4.8 兼容代码)。我不确定如何从 static_assert 中“调用”std::string 方法。
#define MyStaticAssert_isInt(num, message) \
static_assert(std::string(#num).find_first_not_of("0123456789") == std::string::npos, message) \
static_assert(std::string(#num).front() != '0', message) \
static_assert(!std::string(#num).empty(), message)
提前致谢!
【问题讨论】:
-
我很确定 (2) 里面不应该有“不”:)
-
True...条件 (2) 应声明“如果第一个字符为 '0',则失败”...换句话说,我们不想接受类似于“001”的内容"
标签: c++ c++11 static-assert