【问题标题】: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;
      ^
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多