在许多情况下,模板函数和类型需要静态断言来限制可接受的特化类型或其他条件。然后需要有意义的编译器错误消息。如果您不想为每种情况逐个编写字符串文字,可以为错误消息或完整断言创建一些宏,但是 如何隐式地将类型/函数的名称包含在错误消息中?
在下面的示例中, 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)
}
};
对于模板类型,如果在构造函数中执行静态断言,那么函数的名称就足够了。对于这种情况,有C99标准宏__func__
,但事实证明static_assert并不接受它作为字符串文字。
那么解决方案是什么?