Day3: 函数模板显式实参

1. 若定义模板时,由用户控制函数返回类型,T1 compare(T2,T3);T1不存在于参数表中,系统无法从用户输入的参数中判断出返回值类型,则需要用户在使用时提前指定一个类型(注:如果函数形参中没有会被使用的T,或者需要表示二维数组,就需要显式指定实参)
template <typename T1,typename T2, typename T3>
T1 sum(T2,T3);
//指定形式如下:
auto value=sum<long long>(i,lng);
//long long为T1,i,lng为合法的任意类型数据

显式实参读取规则:
从左至右与模板参数匹配
template <typename T1,typename T2,typename T3>
T3 sum(T1,T2);//此处则需把T1,T2,T3全部显示指定,即:
auto value=sum<long long,int,long>(i,lng);

2. 显式指定的实参对函数参数进行强制类型转换后再与模板参数进行匹配
template<typename T>bool compare(T,T);
//指定语句如下:
bool comp<long long>(lng,1024);//1024由const int 被转换为long long,(lng为long型)
bool comp<int>(lng,1024);
bool comp(lng,1024)//错误,lng与1024类型不同
P604 习题16.37
标准库max函数有两个参数,它返回其中较大者。请问可以在调用max时,传递给它一个int和一个double吗?
template<typename T>
T max(T a,T,b)
{
return a>b?a:b;
}
int main()
{
int a=3;double b=3.5;
cout<<max<double>(a,b)<<endl;
}

3. 利用模板找出二维数组中每行最大值时,数组参数需要显式实例化
#include<iostream>
using namespace std;
template<size_t m, size_t n, class T>
void findmax(T a[m][n])
{
	for (int i = 0; i < m; i++)
	{
		T most = NULL;
		for (int t = 0; t < n; t++)
		{
			if (*(*(a + i) + t) > most)
				most = *(*(a + i) + t);
		}
		cout << most;
	}
}
int main()
{
	char arrayset[3][3]{ 'a','b','c','d','e','f','g','h','i' };
	double arraydouble[3][5]{ 1.1,1.3,1.6,1.7,1.3,2.6,5.4,2.7,8.7,5.6,4.7,3.7,2.9,1.7,5.8 };
	findmax<3, 5>(arraydouble);
	system("pause");
}
相当于用常量设置数组大小

习题16.39
对于compare函数,使用一个显式模板实参,使得可以向函数传递两个字符串字面常量

template<typename T>
int compare(T a,T b)
{
if(a>b)return 1;
if(a==b) return 0;
else return -1;
}
int main()
{
cout<<compare<const string&>("hello","nihao")<<endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值