奇异递归模板(Curiously Recurring Template Pattern,CRTP)正如其名,是一种递归式利用c++模板的设计模式,更一般地被称作F-bound polymorphism,是我最近在开发数学库的时候听闻的一种惯用法。
What is CRTP?
CRTP的代码很简单,可以用如下的代码演示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| template <typename Child> struct Base { void interface() { static_cast<Child *>(this)->implementation(); } };
struct Derived : Base<Derived> { void implementation() { cerr << "Derived implementation\n"; } };
template <typename ChildType> struct VectorBase { ChildType &underlying() { return static_cast<ChildType &>(*this); } inline ChildType &operator+=(const ChildType &rhs) { this->underlying() = this->underlying() + rhs; return this->underlying(); } };
|
父类接收一个子类作为模板参数,子类在实现的时候将自身传入(递归),父类利用这个模板参数将自身静态转换为子类的引用后调用子类的函数。