繁体   English   中英

如何将类型名称转换为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;
  ^

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM