CRTP

这篇文章介绍了什么是CRTP(奇异的递归模板模式)
原文
stackflow上讨论了CRTP
问题

我的理解

  • 简而言之,就是基类是个模板类,模板参数是基类类型。

template <class T>
class X{...};
class A : public X<A> {...};


- 它的存在是为了实现多态或者是一种类似多态功能。我觉得这不是CRTP的本意。例子如下:
>```c++
template<typename T>
class Base
{
public:
    void method()
    {
        static_cast<T*>(this)->methodImpl();
    }
private:
    void methodImpl()
    {
        cout << "base method" << endl;
    }
};
class Extend1 :public Base<Extend1>
{
public:
    void methodImpl()
    {
        cout << "Extend1 method" << endl;
    }
};
class Extend2 :public Base<Extend2>
{
public:
    void methodImpl()
    {
        cout << "Extend2 method" << endl;
    }
};
void main()
{
    Extend1 e1;
    Extend2 e2;
    e1.method();
    e2.method();
}

网上好多说法是这体现了CRTP的静态绑定,性能优于虚函数实现的动态绑定。其实这根本不能体现多态。多态是由基类对象通过虚函数表,实现的对不同子类函数的调用。

  • CRPT其实是让子类获取基类能力的方法,并且子类中不需要添加任何代码。也就是说,基类是一个功能模板,只要被继承,子类就获得其功能。例子:

//单例模式基类
class Singleton
{
public:
static ActualClass& GetInstance()
{
if(p == nullptr)
p = new ActualClass;
return p;
}
protected:
static Actualclass
p;
private:
Singleton(){}
Singleton(Singleton const &);
Singleton& operator = (Singleton const &);
};
template <class T>
T* Singleton<T>::p = nullptr;
//子类也是一个单例模式类
class A: public Singleton<A>
{
//Rest of functionality
};

```c++
template<class Derived>
//基类类实现== != >等操作 派生类只需要实现<操作
class Equality
{
};
template <class Derived>
bool operator == (Equality<Derived> const& op1, Equality<Derived> const & op2)
{
    Derived const& d1 = static_cast<Derived const&>(op1);//you assume this works     
    //because you know that the dynamic type will actually be your template parameter.
    //wonderful, isnit it?
    Derived const& d2 = static_cast<Derived const&>(op2); 
    return !(d1 < d2) && !(d2 < d1);//assuming derived has operator <
}
//只要派生类继承Equality 就能实现其他三个操作 大大减少了代码量
struct Apple:public Equality<Apple> 
{
    int size;
};
bool operator < (Apple const & a1, Apple const& a2)
{
    return a1.size < a2.size;
}
int main()
{
    Apple a1;
    Apple a2; 
    a1.size = 10;
    a2.size = 10;
    if(a1 == a2) //the compiler won't complain! 
    {
    }
}
  • 通过这些例子,可以看出CRPT是一种非常有效的减少代码量的手段,能够快速让子类获取自身能力,而不新增任何代码。至于它的静态多态,我认为是不合理的。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,839评论 18 399
  • 再读高效c++,颇有收获,现将高效c++中的经典分享如下,希望对你有所帮助。 1、尽量以const \enum\i...
    橙小汁阅读 1,264评论 0 1
  • Java基础常见英语词汇(共70个)['ɔbdʒekt] ['ɔ:rientid]导向的 ...
    今夜子辰阅读 3,384评论 1 34
  • 很实用的编程英语词库,共收录一千五百余条词汇。 第一部分: application 应用程式 应用、应用程序app...
    春天的蜜蜂阅读 1,480评论 0 22
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,259评论 19 139