2022年6月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重载和友元方面的知识。这块知识先收藏下来,知道有这么个东西,等日后有时间或者突发奇想的时候也许可以用得上!

你可能感兴趣的:(c++,服务器)