> 文档中心 > 2022年3月11日记:王老师的春天,奇异的模板模式

2022年3月11日记:王老师的春天,奇异的模板模式

推荐一个 零声学院 免费公开课程,个人觉得老师讲得不错,分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习]
后台服务器:https://course.0voice.com/v1/course/intro?courseId=5&agentId=0


DEMO1

template <typename T>  class Base {public:void asDerived(){T& derived = static_cast<T&>(*this); derived.myfunc(); }private:Base() {};friend T; };class Derived1 : public Base<Derived1> {public:void myfunc(){cout << "Derived1::myfunc()执行了" << endl;}//......};

案例1中可以注意到,Base类中的 T& derived = static_cast(*this);这 写法有点怪异,至少我看着是有些奇怪,它是把模板T类型的变量放在Base类中,然后去调用T类型对象函数

Derived1 myd;myd.asDerived(); //调用基类的成员函数

在main函数中调用是这样调用的,真的是看起来丈二和尚,让人摸不清头脑,非常的奇怪。

DEMO2

template<typename T>struct shape{//把派生类对象是否相等的判断挪到了基类中(使用了在类模板中定义友元函数的手段把全局的operator==放到基类中)friend bool operator==(const shape<T>& obj1, const shape<T>& obj2) //在类模板中定义友元{const T& objtmp1 = static_cast<const T&>(obj1);//派生类对象也是基类对象,所以这种静态类型转换没问题const T& objtmp2 = static_cast<const T&>(obj2);if (!(objtmp1 < objtmp2) && !(objtmp2 < objtmp1))return true;return false;}};struct square : public shape<square>{int sidelength; //边长};//类外运算符重载bool operator<(square const& obj1, square const& obj2){if (obj1.sidelength < obj2.sidelength){return true;}return false;}

案例2是案例1的一个衍生品,但是里面加入了operator重载和友元方面的知识。这块知识先收藏下来,知道有这么个东西,等日后有时间或者突发奇想的时候也许可以用得上!

安全期查询