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;
}