- CRTP:奇特的递归模板模式
- 与多态的区别:多态是动态绑定(运行时绑定),CRTP是静态绑定(编译时绑定)
- 在实现多态时,需要重写虚函数,因而这是运行时绑定的操作
- CRTP在编译期确定通过基类来得到派生类的行为,它通过派生类覆盖基类成员函数来实现静态绑定的
- 特点:基类模板中函数的实现通过static_cast将this指针转换为模板参数(即派生类)类型,并调用派生类的函数版本
- 学习连接: https://blog.csdn.net/jiang4357291/article/details/103325377 https://www.modernescpp.com/index.php/c-is-still-lazy https://www.zhihu.com/question/332147621 https://www.cnblogs.com/rainySue/p/c-qi-te-de-di-gui-mo-ban-mo-shi-CRTP.html
- 举例:如果你有一组动物的对象,里面有猫有狗,要为他们吃东西就得用到了。
demo:
## 实现对象的计数
template<typename T>
struct counter
{
counter()
{
objects_created++;
objects_alive++;
}
virtual ~counter()
{
--objects_alive;
--objects_created;
}
static int objects_created;
static int objects_alive;
};
template<typename T>
int counter<T>::objects_created(0);
template<typename T>
int counter<T>::objects_alive(0);
class Obj : public counter<Obj>
{
public:
Obj()
{
}
~Obj()
{
}
void print()
{
cout << "sss" << endl;
}
};
int main()
{
Obj obj;
cout << Obj::objects_created << endl;
cout << Obj::objects_alive << endl;
obj.~Obj();
cout << Obj::objects_created << endl;
cout << Obj::objects_alive << endl;
return 0;
}
本文由 Ryan 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2020/08/06 17:26