如何将类型名称放入 static_assert 错误中?
How do I get type names into static_assert errors?
假设我有这个程序,其中我想要一堆专用类型而不是通用类型。当我编译它时,我想得到 "Error: Int"
而不是 "Error: Z"
。我试过 typeof(Z)
但没有得到任何结果 - 有没有标准技巧?
template<class Z>
Z derp()
{
static_assert(false, "Error: Z");
}
template <>
double derp<double>()
{
return 5;
}
int main()
{
double b = derp<double>();
int r = derp<int>();
return 0;
}
严格来说,您的程序格式错误,不需要诊断,因为该静态断言违反了 [temp.res]/8。但这很容易修复。我们可以将主模板定义为已删除:
template<class Z>
Z derp() = delete;
template<>
double derp<double>()
{
return 5;
}
int main()
{
double b = derp<double>();
int r = derp<int>();
return 0;
}
现在程序的结构很好,除非实际调用了初级特化。大多数编译器也会给出你想要的错误信息。这是 Clang 5.0:
prog.cc:14:13: error: call to deleted function 'derp'
int r = derp<int>();
^~~~~~~~~
prog.cc:2:3: note: candidate function [with Z = int] has been explicitly deleted
Z derp() = delete;
^
假设我有这个程序,其中我想要一堆专用类型而不是通用类型。当我编译它时,我想得到 "Error: Int"
而不是 "Error: Z"
。我试过 typeof(Z)
但没有得到任何结果 - 有没有标准技巧?
template<class Z>
Z derp()
{
static_assert(false, "Error: Z");
}
template <>
double derp<double>()
{
return 5;
}
int main()
{
double b = derp<double>();
int r = derp<int>();
return 0;
}
严格来说,您的程序格式错误,不需要诊断,因为该静态断言违反了 [temp.res]/8。但这很容易修复。我们可以将主模板定义为已删除:
template<class Z>
Z derp() = delete;
template<>
double derp<double>()
{
return 5;
}
int main()
{
double b = derp<double>();
int r = derp<int>();
return 0;
}
现在程序的结构很好,除非实际调用了初级特化。大多数编译器也会给出你想要的错误信息。这是 Clang 5.0:
prog.cc:14:13: error: call to deleted function 'derp'
int r = derp<int>();
^~~~~~~~~
prog.cc:2:3: note: candidate function [with Z = int] has been explicitly deleted
Z derp() = delete;
^