如何将类型名称放入 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;
  ^