使模板函数编译失败,并返回错误消息

Making template function compilation fail with an error message

本文关键字:返回 错误 消息 失败 函数 编译      更新时间:2023-10-16

我有一些模板函数&类在实例化时应失败编译,并给出错误消息。我以前用过下面的宏,它在VisualStudio&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()语法吗?

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