在我之前的问题中,我想使用 static_assert 将模板参数限制为特定的子类型。问题得到解答,存档代码如下:
template <typename T>
struct X {
static_assert(std::is_base_of<Y,T>::value,"T must be derived from Y!");
};
现在,我想让错误信息更简洁。即,我想说明哪种类型违反了此约束。例如,如果类A
不是派生自Y
并且有人实例化X<A>
,则错误消息应打印“类型参数必须从 Y 派生,但A不是”。
这是否可以通过标准库以某种方式实现?
我看到了两个挑战:
- 在编译时组装字符串而不使用 boost::mpl
- 检索 T 实例化的类型的名称。名称应该有意义,理想情况下与违规定义中使用的名称相同。我试过 typeid(T).name() 但它只返回不可接受的损坏名称。我记得有某种宏可以返回某物的名称,但我想不起来了。