设计模式种最熟知的是23种经典设计模式,但奇异递归模板模式(Curiously Recurring Template Pattern, CRTP)是否有资格被单独当成一种设计模式,但是在C++种,CRTP确实是一种模式。其理念非常简单: 继承者将自身作为模板参数传递给基类
struct Foo : Base<Foo>
{...
}
这么做的一个原因是:可以在基类的实现中 访问特定类型 的this指针
假设积累Base的每个单一派生类均实现了迭代所需要的begin() && end()接口,那么如何在基类Base的内部而不是派生类的内部迭代对象?直觉告诉我们不能这么做,因为Base自身并没有提供begin() && end() 接口。但是,如果使用CRTP便可以将自身的信息传递给基类:
struct MyClass : Base<MyClass>
{class iterator{.....}iteretor begin() const {.....}iterator end() const {.....}
}
So,这意味着我们在基类的内部,可以将this指针转换为派生类的类型:
template <typename Derived>
struct Base
{void foo(){for (auto& item : *static_cast<Derived*> (this)){//.....}}
};
当MyClass的某个实例调用foo接口时,this指针将Base转为MyClass(下转型)。然后通过解引用这个指针,并在range-based for loop中实现迭代(通过调用MyClass::begin() && MyClass::end()
)
后面有机会再多写点…