您的位置:首页 > 编程语言 > C语言/C++

C++惯用法:奇特的递归模板模式(Curiously Recurring Template Pattern,CRTP,Mixin-from-above)

2011-06-06 10:04 691 查看
意图:

使用派生类作为模板参数特化基类。

与多态的区别:

多态是动态绑定(运行时绑定),CRTP是静态绑定(编译时绑定)

在实现多态时,需要重写虚函数,因而这是运行时绑定的操作。

然而如果想在编译期确定通过基类来得到派生类的行为,CRTP便是一种独佳选择,它是通过派生类覆盖基类成员函数来实现静态绑定的。

范式:

class derived : public base<derived>
{
// attributes and behaviors
}


示例代码:

template <class Derived>
struct base
{
void interface()
{
// 转换为子类指针,编译期将绑定至子类方法
static_cast<Derived*>(this)->implementation();
}

static void static_interface()
{
// 编译期将绑定至子类方法
Derived::static_implementation();
}

// 下面两个方法,默认实现可以存在,或者应该被继承子类的相同方法覆盖
void implementation();
static void static_implementation();
};

// The Curiously Recurring Template Pattern (CRTP)
struct derived_1 : base<derived_1>
{
// 这里子类不实现,将使用父类的默认实现
//void implementation();

// 此方法将覆盖父类的方法
static void static_implementation();
};

struct derived_2 : base<derived_2>
{
// 此方法将覆盖父类的方法
void implementation();

// 这里子类不实现,将使用父类的默认实现
//static void static_implementation();
};


缺点:

CRTP由于基类使用了模板,目前的编译器不支持模板类的导出,因而不能使用导出接口。

其它使用领域:

在数值计算中,往往要对不同的模型使用不同的计算方法(如矩阵),一般使用继承提供统一接口(如operator运算符),但又希望不损失效率。这时便又可取CRTP惯用法,子类的operator实现将覆盖基类的operator实现,并可以编译期静态绑定至子类的方法。

英文链接:http://en.wikibooks.org/wiki/More_C++_Idioms/Curiously_Recurring_Template_Pattern
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: