使模板函数编译失败并显示错误消息

时间:2014-07-08 03:39:29

标签: c++ clang static-assert

我有一些模板功能&实例化时应该使用给定的错误消息编译失败的类。我之前使用过以下宏,它在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()语法?

1 个答案:

答案 0 :(得分:2)

您需要拥有一部分条件,具体取决于模板参数。否则,在模板实例化之前,编译器不需要推迟评估它。这就是sizeof(T)==0工作的原因。