c++模板-template

为什么需要模板?

       我们使用过重载函数,c++可以根据函数的函数和所属类的不同正确的选择调用哪个参数。比如,我们要实现一个函数,完成int、float、double三种类型的数据的加法,那么我们可以重载add函数,来实现这个功能。函数原型如下:

int add(int, int);
float add(float, float);
double add(double, double);

想一下,这个方法存在这几个问题:

(1)除了数据类型不同,代码逻辑是一模一样的,而我们却要重复写三次相同逻辑的代码,显然这有点浪费精力。

(2)如果需求变了,还要实现char类型数据的相加,那么我们又要加上一个函数char add(char, char);

为了解决上述问题,c++引入了模板。模板是一种实现代码重用的机制,它可以实现类型参数化,即允许把类型定义为参数,在调用的时候传入具体的类型,从而真正的实现代码重用。模板分为两种:函数模板和类模板。

函数模板

函数模板的定义形式如下:

template<typename T_1, typename T_2, ..., typqname T_n>
返回值 函数名(参数列表)
{

}

说明:

  1. 模板定义以template关键字开始,后面跟一个模板参数列表,它是一个用逗号分隔的一个或者多个模板参数的列表,用typename或class来指定T_1...是一个模板类型参数,在这里typename和class的含义相同。一般来说,我们可以将类型参数看做是类型说明符,就像是基本的内置类型或者类类型一样。特别地,类型参数可以用来指定返回值类型或者函数的参数类型,并且可以用于在函数内部申明变量和类型转换。
  2. 模板怎么确定参数呢?当我们调用一个函数模板时,编译器(通常)会用函数实参来为我们推断模板参数的类型,并且会用推断出的模板参数类为我们实例化一个特定版本的函数。当编译器实例化一个模板时,它会使用实际的模板实参代替对应的模板参数来创建出模板的一个新“实例”。

下面看一个函数模板的例子:用函数模板来实现上面的应用场景。

#include <iostream>

using namespace std;

template<typename T>	//定义一个模板函数
T add(T a, T b)
{
	return a + b;
}

int main(int argc, char **argv)
{
	int i1 = 1, i2 = 2;
	cout << add(i1, i2) << endl;

	float f1 = 0.01, f2 = 0.02;
	cout << add(f1, f2) << endl;

	return 0;
}

类模板

       类模板是用来生成类的蓝图的。与函数模板的不同之处是,编译器不能为类模板推断模板参数类型。因此,为了使用类模板,我们必须在模板名后的尖括号中提供额外的信息 --- 用来代替模板参数的模板实参列表。

下面看一个类模板的例子:

#include <iostream>
#include <string>

using namespace std;

template<typename T1, typename T2>
class MyTemplateClass
{
private:
	T1 m;
	T2 n;
public:
	MyTemplateClass(T1 t1, T2 t2);
	void print_data_member();
};

template<typename T1, typename T2>
MyTemplateClass<T1, T2>::MyTemplateClass(T1 t1, T2 t2)
	:m(t1), n(t2)
{

}

template<typename T1, typename T2>
void MyTemplateClass<T1, T2>::print_data_member()
{
	cout << "m = " << m << endl;
	cout << "n = " << n << endl;
}

int main(int argc, char **argv)
{
	//在使用类模板的时候要显然的将模板参数的实例传进去
	MyTemplateClass<int, int> mtc1(1, 1);
	mtc1.print_data_member();

	MyTemplateClass<std::string, std::string> mtc2("one", "two");
	mtc2.print_data_member();

	return 0;
}

猜你喜欢

转载自blog.csdn.net/llfjcmx/article/details/83017258