栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

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

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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   
	class Base 
	{
	public:
		void asDerived()
		{
			T& derived = static_cast(*this); 
			derived.myfunc(); 
		}
	private:
		Base() {};
		friend T; 
	};

	class Derived1 : public Base 
	{
	public:
		void myfunc()
		{
			cout << "Derived1::myfunc()执行了" << endl;
		}
		//......
	};

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

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

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

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

struct square : public shape
{
	int sidelength; //边长
};

//类外运算符重载
bool operator<(square const& obj1, square const& obj2)
{
	if (obj1.sidelength < obj2.sidelength)
	{
		return true;
	}
	return false;
}

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/974217.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号