C++模板

本文深入探讨了C++中的模板特性,包括函数模板的使用,如何通过特例化处理特定类型,以及类模板的声明与实现。文章还介绍了类模板的友元函数模板和类模板的特例化,展示了模板在提高代码复用性和灵活性方面的优势。
摘要由CSDN通过智能技术生成

函数模板

在这里插入图片描述
由于C++中产生符号是依赖于函数名和参数列表,所以可以使用函数重载。函数重载有很多代码冗余,所以很不方便。假如可以把类型也当作参数传递给函数,就可以减少很多代码的冗余。因此使用函数模板可以精简代码,提高编程效率。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
代码不能进行正常编译,说明模板中的语法错误会在生成对应的指令时被编译出来
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

函数模板的特例化

调用优先级:
在这里插入图片描述

普通的函数模板

//普通的函数模板
template<typename T>
bool compare(T a, T b)
{
	cout << "template<typename T>bool compare(T a, T b)" << endl;
	cout << typeid<T>.name() << endl;
	return a > b;
}
	if (compare("aaa", "bbb"))
	{
		cout << "aaa>bbb" << endl;
	}
	else
	{
		cout << "bbb>aaa" << endl;
	}

如果不实现特例化,以上compare()传入的参数类型是const char*类型,但是比较的就是传入的指针大小,及就是比较地址大小,所以结果不可信,因此需要实现函数模板的特例化

函数模板的特例化:针对于某一个类型通配的函数模板不能进行处理,所以需要写一个特例化的函数模板

//函数模板的特例化
template<>
bool compare(const char* a, const char* b)
{
	cout << "bool compare(const char* a, const char* b)" << endl;
	return strcmp(a, b) > 0;
}
if (compare("aaa", "bbb"))
	{
		cout << "aaa>bbb" << endl;
	}
	else
	{
		cout << "bbb>aaa" << endl;
	}

类模板

在这里插入图片描述

template <typename T>
class Arr//一个任何类型数据都可以存放的数组
{
public:
	Arr()
	{
		cout << "Arr()" << endl;
	}
	Arr(const Arr& src)
	{
		cout << "Arr(const Arr& src)" << endl;
	}
	Arr& operator=(const Arr& src)
	{
		cout << "Arr& operator=(const Arr& src)" << endl;
	}
	~Arr()
	{
		cout << "~Arr()" << endl;
	}

	void push_back(const T& val);
	void pop_back();
	T& back();
	T& operator[](int pos);
	int size();

private:
	T* _arr;
	int _len;
	int _val_len;
};

类模板成员方法的类外实现

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

template <typename T>
class Arr//一个任何类型数据都可以存放的数组
{
public:
	Arr()
	{
		cout << "Arr()" << endl;
	}
	Arr(const Arr& src)
	{
		cout << "Arr(const Arr& src)" << endl;
	}
	Arr& operator=(const Arr& src)
	{
		cout << "Arr& operator=(const Arr& src)" << endl;
	}
	~Arr()
	{
		cout << "~Arr()" << endl;
	}

	void push_back(const T& val);
	void pop_back();
	T& back();
	T& operator[](int pos);
	int size();

private:
	T* _arr;
	int _len;
	int _val_len;
};

//类模板成员方法的类外实现
template <typename T>
void Arr<T>::push_back(const T& val);

普通模板函数定义为类模板的友元

输出运算符的重载,定义为函数模板。并不是成员方法的类外实现

template <typename T>
class Arr//一个任何类型数据都可以存放的数组
{
public:
	Arr()
	{
		cout << "Arr()" << endl;
	}
	Arr(const Arr& src)
	{
		cout << "Arr(const Arr& src)" << endl;
	}
	Arr& operator=(const Arr& src)
	{
		cout << "Arr& operator=(const Arr& src)" << endl;
	}
	~Arr()
	{
		cout << "~Arr()" << endl;
	}

	void push_back(const T& val);
	void pop_back();
	T& back();
	T& operator[](int pos);
	int size();

	//友元函数模板
	template <typename TT>
	friend ostream& operator<<(ostream& out, Arr<TT>& src);

private:
	T* _arr;
	int _len;
	int _val_len;
};


//输出运算符的重载,定义为函数模板。并不是成员方法的类外实现
template <typename T>
ostream& operator<<(ostream& out, Arr<T>& src)
{
	for (int i = 0; i < src.size(); i++)
	{
		out << src[i] << " ";
	}
	out << endl;
}

类模板的特例化

template <>
class Arr<const char*>
//类模板的特例化
template <>
class Arr<const char*>
{
public:
	Arr()
	{
		cout << "Arr()" << endl;
	}
	Arr(const Arr& src)
	{
		cout << "Arr(const Arr& src)" << endl;
	}
	Arr& operator=(const Arr& src)
	{
		cout << "Arr& operator=(const Arr& src)" << endl;
	}
	~Arr()
	{
		cout << "~Arr()" << endl;
	}

	void push_back(const const char* val);
	void pop_back();
	const char* back();
	const char* operator[](int pos);
	int size();

private:
	const char** _arr;
	int _len;
	int _val_len;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值