my previous question中,我想使用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派生,但是而不是”。

使用标准库可以以某种方式实现吗?

我看到两个挑战:
  • 在编译时不使用boost::mpl即可编译字符串
  • 检索实例化T的类​​型的名称。名称应有意义,理想情况下应与违规定义中使用的名称相同。我尝试了typeid(T).name(),但是它只返回不正确的名称。我记得有一个宏可以返回某物的名称,但是我再也回想不到。
  • 最佳答案

    你不能做这个。 static_assert需要一个字符串文字。您无法将TY的语义标识组装到字符串文字中。

    您可以希望编译器使模板实例化堆栈易于阅读,并为您提供封闭类模板实例化的TY模板参数的值。

    其他人也考虑过这一点,例如http://comments.gmane.org/gmane.comp.compilers.clang.devel/5073

    09-05 06:55