断言宏参数的完整性
Assert integrality of a macro argument
我正试图创建一个静态断言其参数为严格正整数的宏。这在我的许多其他遗留宏中使用,到目前为止,这些宏只是假设其参数的完整性而不进行任何检查。
简而言之,如果我有一个条目,比如:,我希望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)
提前感谢!
您可以尝试这个用户定义的文字:
#include <cstddef>
#include <string>
constexpr bool operator ""_pure(char const * s, std::size_t len)
{
return len == 0 ||
('0' <= s[0] && s[0] <= '9' && operator ""_pure(s + 1, len - 1));
}
#define CHECK_INT(X) static_assert(X ## _pure, "Not pure")
int main()
{
CHECK_INT("123.0");
}
当然,您可以将字符串化作为宏的一部分。
以下应该允许在编译时检查字符文字:
constexpr bool is_number_cont( const char* str )
{
return !*str || ( *str >= '0' && *str <= '9' && is_number_cont( str + 1 ) );
}
constexpr bool is_number( const char* str )
{
return *str >= '1' && *str <= '9' && is_number_cont( str + 1 );
}
int main()
{
static_assert( is_number( "123" ), "123 failed" );
static_assert( is_number( "0" ), "0 failed" );
static_assert( is_number( "" ), "empty string failed" );
static_assert( is_number( "1.23" ), "1.23 failed" );
static_assert( is_number( "abc" ), "abc failed" );
}
您可以在任何位置添加检查,包括在宏中。
实时示例
如果你被C++11之前的编译器卡住了,你可以使用一个有限的、固定长度的手动扩展:
#define is_number(S)
S[0]>='1' && S[0]<='9' &&
(!S[1] || (S[1]>='0' && S[1]<='9' &&
(!S[2] || (S[2]>='0' && S[2]<='9' &&
(!S[3] || (S[3]>='0' && S[3]<='9' &&
(!S[4] || (S[4]>='0' && S[4]<='9' &&
!S[5]))))))))
如果您需要检查更长的字符串,请展开它,应该很清楚如何做到这一点。
实时示例
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用指向成员的指针将成员函数作为参数传递
- 没有名称的C++模板参数
- 断言宏参数的完整性