【发布时间】:2014-07-08 03:39:29
【问题描述】:
我有一些模板函数和类,它们在实例化时会因给定错误消息而导致编译失败。我之前使用过以下宏,它在 Visual Studio 和 gcc 中运行良好:
#define PFC_CTF_ERROR(msg__) {struct cterror {char msg__:0;};}
如果我有一个模板函数,我喜欢在实例化时编译失败,我会这样使用它:
template<typename T>
void foo()
{
PFC_CTF_ERROR(you_should_never_compile_this_function);
}
但是,现在我将代码移植到 clang/llvm 并且即使未实例化该函数,它也无法编译。所以我尝试了static_assert(false, "message");,但这也失败了(现在甚至在MSVC中)。我认为的一个选项是使用依赖于模板参数的表达式,如下所示:
#define PFC_CTF_ASSERT_MSG(e__, msg__) {struct cterror {char msg__:(e__);};}
template<typename T>
void foo()
{
PFC_CTF_ASSERT_MSG(sizeof(T)==0, you_should_never_compile_this_function);
}
它工作正常,但使用起来很麻烦。有谁知道如何更好地做到这一点并保持旧的PFC_CTF_ERROR() 语法?
【问题讨论】:
-
^ 那里可能有一些有用的想法?
-
@MattMcNabb 感谢您的参考。所有这些答案几乎都表明您必须使用
sizeof(T)==0技巧。我想知道是否有更好的解决方案。
标签: c++ clang static-assert