【问题标题】:How do I get type names into static_assert errors?如何将类型名称放入 static_assert 错误?
【发布时间】:2017-12-28 17:07:16
【问题描述】:
假设我有这个程序,其中我想要一堆专门的类型而不是通用类型。当我编译它时,我想得到"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;
}
【问题讨论】:
标签:
c++
templates
compiler-errors
static-assert
【解决方案1】:
严格来说,由于静态断言违反了[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;
^