在 static_assert 中添加字符串字面量

5
有没有一种方法可以将static_assert输出的内容合并?我的意思是:
template<class T>
struct X
{
static_assert(std::is_signed<T>::value, "Type " + T + " must be signed.");//this doesn't work
};
1个回答

4

基于这个代码无法编译的前提

int main()
{
   const char c[2] = "1";
   static_assert(1==1, c)
}

也不是这样

int main()
{
   const char* c = "1";
   static_assert(1==1, c)
}

如果出现错误 error: expected a string literal,那么我得出的结论是这是不可能的。

"字符串字面值由源字符集中用双引号(")括起来的零个或多个字符组成。字符串字面值表示一个由一系列字符组成的以 null 结尾的字符串。" - C++ 字符串字面值

你可能想考虑使用 Boost::StaticAssert,因为这可能会给你想要的结果。


是的,但它会提供有意义的失败信息,因此将在断言的失败字符串中输出类型。 - satnhak
在我看来,boost static_assert 并没有提供更有意义的信息。两者都指向了代码行,但一个会显示类似于:“在实例化 'X<unsigned int>' 时...错误:静态断言失败:“类型必须为有符号数。” 另一个则会显示类似于:“...错误:对不完整类型 'boost::STATIC_ASSERTION_FAILURE<false>' 应用 'sizeof' 是无效的。” - UncleBens
@UncleBens同意。在这种情况下,Boost不是正确的选择。 - There is nothing we can do
你可以尝试使用BOOST_MPL_ASSERT_MSG。虽然“message”只是出现在错误中的一种类型,但我发现它比其他几乎所有的静态断言机制更易用。 - KitsuneYMG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接