我如何可靠地 static_assert 对任何不是字符串文字的东西?
例如,在下面的代码中,我尝试包装标准断言宏,但静态拒绝任何不是字符串文字的消息(因为当断言触发时,除了字符串文字之外的任何内容都不会在运行时显示)。
#include <cassert>
#include <string>
#include <type_traits>
#define my_assert(test, message)\
static_assert(\
(\
!std::is_pointer<decltype(message)>::value &&\
!std::is_array<decltype(message)>::value\
),\
"literal string required"\
);\
assert((message, (test)));
int main() {
my_assert(1 == 1, "one equals one");
my_assert(1 == 2, "one equals two");
{
const char *msg = "one equals one";
//my_assert(1 == 1, msg); // triggers static_assert
}
{
const char msg[] = "one equals one";
//my_assert(1 == 1, msg); // triggers static_assert
}
{
const std::string msg = "one equals one";
//my_assert(1 == 1, msg.c_str()); // triggers static_assert
}
{
const int msg = 3;
my_assert(1 == 1, msg); // should trigger static_assert
}
}
如您所见,测试是通过 type_traits 标头提供的测试完成的,并且 大部分情况下,此代码按预期工作(使用 gcc 4.7.2 测试)。但是,它并没有专门寻找字符串文字,而只是拒绝了程序员可能就地使用的常见事物。
对于上面的示例,我的解决方案可能已经足够好了,但我也想在其他情况下使用它,或者类似的技术。
所以问题是,我如何可靠地使用 type_traits (或其他标准机制)来 static_assert除了字符串文字之外的任何东西?