我正在尝试编写一个函数来检查类是否派生自基类。基类是遵循奇怪的递归模板模式的基类,即它定义如下:
template<class Derived>
class Base{
派生类的派生如下:
class Derived: Base<Derived>{
为了检查一个类是否以这种方式派生,我写了这个检查器:
template<class T>
constexpr bool basedOn(){
return std::is_base_of<Base<T>,T>::value;
}
它有效!我很惊讶。除非它直接来自Base,否则似乎没有任何回报。它为什么有效?使用CRTP派生的类的完整类型是什么?
答案 0 :(得分:2)
完整类型的Derived
只是Derived
。但它确实继承了Base<Derived>
类型,就像你定义它一样。