我有一些模板功能&实例化时应该使用给定的错误消息编译失败的类。我之前使用过以下宏,它在Visual Studio和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()
语法?
答案 0 :(得分:2)
您需要拥有一部分条件,具体取决于模板参数。否则,在模板实例化之前,编译器不需要推迟评估它。这就是sizeof(T)==0
工作的原因。