c++ - 如何将类型名称放入 static_assert 错误中?

标签 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;
}

最佳答案

严格来说,您的程序格式错误,不需要诊断,因为该静态断言违反了 [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;
  ^

关于c++ - 如何将类型名称放入 static_assert 错误中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48011493/

相关文章:

C++: vector 大小错误且大于元素数

C++编译 fatal error

compiler-errors - 由于 glib 错误,无法处理 gobject-introspection

c++ - 图像中的 Opencv 评级特征

c++ - 使用 MySQL C++ Connector 解析 undefined reference

c++ - 使用 Boost 传递类函数时出现无效模板错误

C++:根据模板参数填充数组

c++ - 确定类型是否具有特定的成员函数签名

visual-studio - cl(Windows Visual Studio编译器)是否应该在任何命令提示符下工作?

c++ - 如何在 C++ Qt Creator 中使用库