Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在静态断言错误中包含类型或函数名_C++_C++11 - Fatal编程技术网

C++ 在静态断言错误中包含类型或函数名

C++ 在静态断言错误中包含类型或函数名,c++,c++11,C++,C++11,在许多情况下,模板函数和类型需要静态断言来限制可接受的专门化类型或其他条件。然后需要一条有意义的编译器错误消息。如果不想为每种情况逐个编写字符串文字,可以为错误消息或完整断言创建一些宏,但是 如何在错误消息中隐式包含类型/函数的名称? 在下面的示例中,FUNCNAME是一个虚构的关键字,它会让神奇发生: #include <type_traits> #define ASSERT_INTEGRAL(T) static_assert(std::is_integral<T>:

在许多情况下,模板函数和类型需要静态断言来限制可接受的专门化类型或其他条件。然后需要一条有意义的编译器错误消息。如果不想为每种情况逐个编写字符串文字,可以为错误消息或完整断言创建一些宏,但是 如何在错误消息中隐式包含类型/函数的名称?

在下面的示例中,FUNCNAME是一个虚构的关键字,它会让神奇发生:

#include <type_traits>

#define ASSERT_INTEGRAL(T) static_assert(std::is_integral<T>::value, \
FUNCNAME ## " would be happy with specializations for integral types");

template <typename T>
class A
{
  public:

    A()
    {
        ASSERT_INTEGRAL(T)
    }
};
#包括
#定义ASSERT_INTEGRAL(T)static_ASSERT(std::is_INTEGRAL::value\
FUNCNAME##“对整型的专门化很满意”);
模板
甲级
{
公众:
()
{
积分(T)
}
};
对于模板类型,如果在构造函数中执行静态断言,那么函数名就足够了。在这种情况下,有C99标准宏
\uuuu func\uuuu
,但事实证明,static\u assert不接受它作为字符串文本


那么解决方案是什么呢?

编译器应该尽最大努力提供断言失败的上下文,包括所涉及的类型。据我所知,没有一种可移植/标准的方法可以做到这一点。那么建议一些特定于编译器的解决方案,我将构建一个#ifdef结构化块。我也不知道特定于编译器的解决方案。请记住,由fialing
静态断言触发的错误消息将已经包含此信息!例如,gcc将在“A::A()[with T=std::basic_string]”的实例化中报告如下内容:
——这将为您提供所需的一切。如果您的编译器没有-也许是升级的时候了?另外-这可能会提供一些指针: