如何将类型名称转换为static_assert错误?

时间:2017-12-28 17:07:17

标签: c++ templates compiler-errors static-assert

假设我有这个程序,我想要一堆专门的类型而不是一般类型。当我编译它时,我想要"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;
}

1 个答案:

答案 0 :(得分:3)

严格来说,由于违反[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;
  ^