函数模板

c++模板 template 函数模板和类模板

模板的意义:可以把类型参数化
bool compare(int a,int b)//参数化实参的值
{
	return a>b?a:b;
}
bool compare(double a,double b)//非模板函数,普通函数
{
	return a>b?a:b;
}



//类模板的类型参数可以给默认值,从右向左给
//但是函数模板是不能给默认值的
//template<>  :定义模板的参数列表,模板类型参数可以用typename和class定义,<>中也可以写非类型参数如int len
		但是在后面这个len是不能进行更改的,非类型参数只能是常书,不能是浮点型和类类型

模板不会进行编译,函数模板用具体的类型进行实例化就会产生模板函数
他是在函数的调用点进行实例化的,  模板函数才需要进行编译,他们都是在编译阶段进行的。如果没有模板的实例化
模板中的错误是发现不了了。
模板名加上参数列表才能得到函数名
但是参数列表也是可以省略的,可以通过模板的实参推演得到函数名
模板函数,函数模板和非模板函数是可以共存的


template<typename T>
bool compare(T a,T b)//--->函数模板,这时compare叫做模板名
{
	return a>b?a:b;
}

bool compare<int>(int a,int b)//经过模板实例化后称为-》模板函数,模板函数才会进行编译
{
	return a>b?a:b;
}
模板的实例化就是指在调用点用具体的类型去替换虚假类型的过程
模板的实例化过程:
	1.模板的处理是在编译阶段处理的,它属于类型重定义的过程,
	2.在调用点编译模板函数



//模板的特例化(特殊实例化)完全特例化,现在的模板是会编译的,特例化的模板函数调用优先级高于模板版本
template<>
bool compare<const char*>(const char* a,const char* b)//模板函数
{
	return strcmp(a,b)==0;
}

int main()
{
//函数的调用点,用int从compare模板实例化一个compare<int>函数
//属于隐式实例化
	compare<int>(10,29);//编译器就会产生一个对应类型的模板函数
	compare(10,29);	    //模板的实参推演,模板会根据输入的实参推演出模板的类型
	//如果模板推演的实参有二义性则会报错

	compare(19,10.2);//这时就会报错,除非采用第一种做法可以强转

	compare("aaa","bbb");//由于普通的< > =在字符串中不满足需求,所以需要针对这个类型进行特殊的处理
				//这时由于直接使用模板函数会出现错误,所以需要手动写一个模板的特例化函数
			      //如果存在一个叫做compare的非模板函数,那么编译器会优先调用非模板函数
	

模板的默认值:默认值是类型而不是数
如果做三个数相加
template<typename R=int,typename T=int ,typename E=int ,typename W=int>
R sum(T a, E b,W c)
{
	return a+b+c;
}
所以可得知模板的类型可以来自:<>直接获取,实参推演,默认值,在这三者之中<>优先,其次是实参推演,最后是默认值
所以在没有明确给出类型,且没有实参推演的情况下,会使用模板的默认值。
模板默认值的赋值规则是随机赋予的,可以给任何位置的类型参数添加默认值(c11标准)
如果模板中的某个变量是在程序中是需要初始化的,我们可以使用零构造对其进行初始化
template<typename T>
T sum(T a)
{
	T tmp=T();
	return tmp+a;
}


可以用auto 定义的变量来接收不明确的返回值



模板的显示实例化:

模板如果放在两个文件中a文件用于定义,b文件去声明使用,会出现链接阶段的错误,这时因为,b文件中如果只写了模板
的声明,那么在编译后也就只会生成模板函数的声明,而不会产生模板的定义
而在a文件中虽然有模板的定义,但是由于a文件中并没有对模板的调用,所以就不会产生模板的实例化
导致链接时由于没有完整的模板函数产生也就无法使用模板函数
当然也有解决方法,可以采用模板的显示实例化,如果在a.cpp文件中存在
template<typename T>
bool compare(T a,T b)//--->函数模板,这时compare叫做模板名
{
	return a>b?a:b;
}
这样的模板定义,这时可以在a文件的后面写上:
template bool compare<int>(int a,int b)//模板的显示实例化
template bool compare<double>(double a,double b)//模板的显示实例化
这样就可以强制编译器产生这两种类型的模板函数

但是模板一般写在.h文件中,当需要使用是,只需调用一下头文件即可






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值