【C++心得分享】模板学习

本文作者通过学习侯捷的视频,分享了关于C++模板的心得,包括类模板的普通使用、特化(全特化与偏特化)以及模板函数的应用。还提及了操作符重载的有趣现象,并邀请读者交流讨论。

最近在看侯捷的视频,里面有提到模板以及操作符重载的一些东西,也让我回忆起了在学校里面学习的知识。相当于做一个总结吧。

模板类
首先看一个简单的模板类

template<typename T = string>
class BasicTemplateClass
{
public:
	BasicTemplateClass()
	{
		cout << "template class..." << endl;
	}
};

调用它的方式很简单 
BasicTemplateClass<> obj_1;
BasicTemplateClass<int> obj_2;

这其中如果相对某一种类型特殊处理,可以特化某一个模板

template<>
class BasicTemplateClass<string>
{
public:
	BasicTemplateClass()
	{
		cout << "string version template class..." << endl;
	}
};

然后我们在调用stirng版本的类额时候,就会打出 string version template class...

在看一个偏特化的模板类

template<typename T, typename Y = int>
class BasicTemplateClass
{
public:
	BasicTemplateClass()
	{
		cout << "size_T:" << sizeof(T) << ", size_Y:" << sizeof(Y) << endl;
	}
};
调用它的方式也很简单
BasicTemplateClass<string> obj_1;
BasicTemplateClass<string,int> obj_2;

最后看一个全特化的模板类

template<typename T = string, typename Y = int>
class BasicTemplateClass
{
public:
	BasicTemplateClass()
	{
		cout << "size_T:" << sizeof(T) << ", size_Y:" << sizeof(Y) << endl;
	}
};

调用它的方式也很简单
BasicTemplateClass<> obj_1;
BasicTemplateClass<string> obj_2;
BasicTemplateClass<string, int> obj_3;

模板函数

template<typename T>
bool template_func(T t1, T t2)
{
	return t1 > t2;
}

调用它的方式也很简单
template_func("123", "234");
貌似不用给出类型,不大清楚为什么会这样,先放着吧。(侯捷给出的理由未必可信)
函数模板也是可以特化的,但是没啥意义,本来就不用给出参数类型,特不特化都没意义。
我最开始看视频的时候,怀疑了一下,是不是真的不用给出类型参数,然后想了一下::sort 和 ::find。嗯,你赢了。

当然,提到这里就说一下视频里面给出的sort这个例子,提到了::sort 和 list::sort 这两个例子,在给代码的时候有一个first + (last - first) / 2 下标的访问,虽然贴的代码不全,虽然我也懒得去找这段代码,但是光看这个玩意,数组的排序应该是采用了快速排序

10-03 补充 一下,以下全为自己搜集资料以及猜想所得,不对的地方希望大家指正
想了几天,我觉得可能是这样的。比如我们定义一个Student类,我们能采用sizeof’ 求取这个类需要的空间,扩充到模板类里面,那我们在定义对象的时候,也应该需要知道我们需要申请多大的空间来存放类成员,所以在定义对象的时候需要给出这个类型。调用函数的时候,我们只需要告诉计算机函数指令的地址在哪就可以了,里面是什么类型,需要怎么处理那都是函数体需要做的事情,与调用的地方无关,不需要调用者自己去为某些变量分配空间,这样也就不需要知道类型了,所以函数调用的地方无需给出参数类型。

操作符重载

class Student
{
public:
	Student(string name, int age) : m_name(name), m_age(age)
	{

	}

	bool operator>(Student& ths);

private:
	string m_name;
	int m_age;
};

inline
bool Student::operator>(Student& ths)
{
	return this->m_age > ths.m_age;
}

template<typename T>
bool maxer(T t1, T t2)
{
	return t1 > t2;
}

调用:
Student st1("jerry", 29);
Student st2("Jack", 27);
cout << "ret:" << maxer(st1, st2) << endl;

这里有一个奇怪的现象:

我们把函数改成这样
class Student
{
public:
	Student(string name, int age) : m_name(name), m_age(age)
	{

	}

	bool operator >(Student& ths);

private:
	string m_name;
	int m_age;
};

inline
bool Student::operator >(Student& ths)
{
	return this->m_age > ths.m_age;
}

template<typename T>
bool max(T t1, T t2)
{
	//return t1 > t2;
	return t1.operator >(t2);
}

然后还是可以正常调用,其实也没有什么不妥,但是不是应该限制一下呢?

今天就到这里吧,十一的第一天,大家都到哪里去玩了呢,博主本来打算去献一下血,但是被告知距离上次献血不到半年,不能献血。然后博主一脸尴尬的从排着的队伍里面溜出去了。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值