c++模板1

函数模板

函数模板的格式为:

template<typename T1,typename T2...>
函数返回值类型 函数名(参数列表)
{
	//函数体
}

typename是定义模板参数的关键字,可以使用class来代替(不能使用struct)

函数模板本身并不是函数,在编译阶段,编译器通过用户传参自动识别参数类型,从而推导出模板函数参数列表的类型,得到一个函数供用户使用,这样就可以通过用户传递的参数类型的不同,得到一批仅仅只是类型不同的函数,相当于把重复做的事情交给了编译器,从而提升了开发效率。
当编译器对同一typename推到出不同类型时会出错:

template<typename T>
void swap(T& num1,T& num2)
{
	T temp=num1;
	num1=num2;
	num2=temp;
}

int main()
{
	int num1=1;
	float num2=2.0;
	swap(num1,num2);//T被推导出不同的类型,出错
}

类似于上面的swap函数由编译器自动推导typename的类型的称为隐式实例化,还有一种实例化方式为显式实例化:

函数名 <指定类型>(参数)

有些场景只能使用显式实例化

template<typename T>
T* fun(int n)//所有参数已经是特定类型
{
	return (T*)malloc(n);
}

int main()
{
	int n=100;
	int*p=fun<int>(n);//显式实例化
	
	return 0
]

要注意在显式实例化中<>里面的类型个数要与template的<>中的typename的个数相同,同时是自左向右依次匹配typename的类型。

模板参数匹配原则:
①一个非模板函数与一个同名的模板函数同时存在,且该模板函数可以实例化出这个非模板函数时,优先使用非模板函数。


int Sum(int num1, int num2)
{
	cout << "非模板函数" << endl;
	return 0}

template<typename T1,typename T2>
int Sum(T1 num1, T2 num2)
{
	cout << "模板函数" << endl;
	return 0;
}
int main()
{
	int num1=1;
	int num2=2;
	Sum(num1, num2);//优先使用非模板函数
	Sum<int, int>(num1, num2);//使用模板函数

	return 0;
}

②当非模板函数参数类型不匹配,而模板可以实例化出一个参数更匹配的函数时,优先使用模板实例化函数

int Sum(int num1, int num2)
{
	cout << "非模板函数" << endl;
	return 0;
}

template<typename T1,typename T2>
int Sum(T1 num1, T2 num2)
{
	cout << "模板函数" << num2<<endl;
	return 0;
}
int main()
{
	int num1=1;
	float num2=2.0;//浮点型
	Sum(num1, num2);//优先使用模板实例化函数

	return 0;
}

总的来说就是哪个参数更匹配就优先使用哪个,如果两个参数都匹配就优先使用现成的(非模板函数)。

类模板

类模板的定义格式为:

template<class T1,class T2...>
class 模板类类名
{
	//类体
};//注意这里有分号

模板类的成员函数的声明和定义分离时,形式如下:

template<class T>
class MyVector
{
public:
	viod fun1();//函数声明
private:
	//...
};

//函数定义
template<class T>
void MyVector<T>::fun()//注意返回值类型的位置
{
	//...
}

模板类的实例化格式为:

模板类类名<数据类型> 类名

模板类的类名不是真正的类,而实例化才是真正的类

MyVector<int> s;
//实例化出一个类后,利用该类实例化出一个对象s

需要注意的是类模板不能将声明和定义分离到两个文件中。

模板复用了代码,可以节省资源,增强了代码的灵活性,但其也会使得模板编译出错时的错误信息非常凌乱,定义定位错误,同时也会使得编译时间变长。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值