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

问题描述 投票:3回答:1

假设我有这个程序,其中我想要一堆专门的类型而不是一般类型。当我编译它时,我想得到"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个回答
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;
  ^
© www.soinside.com 2019 - 2024. All rights reserved.