函数模板的使用
函数模板的格式
格式:template<typename 自定义通用类型名>
返回值 函数名(参数){ }
例如:template< typename T>
void fun(T a,T b){ }
typename -----表明后的类型是一个通用类型,或许叫做虚拟类型
T1------------通用类型或者虚拟类型,(理解成类型)可以在函数中直接当做普通类型使用。
其中typename也可用class替代,两者用法上的区别可以参考此文章: 链接
函数模板的调用
第一种 显式类型推导: 函数名 <实际类型1,实际类型2>(参数列表);
第二种 隐形类型推导: 函数名(参数);
注意:显示类型推导 参数和推导的类型必须一致。模板函数,在调用时可以用显示调用,省略类型的方式,例如:fun<>(参数列表)
类模板的使用
类模板的格式
格式:template< typename T>
class test { T age; };
实例化: 类名<类型> 变量名(参数);
类模板和函数模板区别
第一:函数模板可以使用隐式类型推导,但类模板不可以,必须显示推导。
第二:类模板在定义template时候,可以加上默认参数。template<class T1,class T2=string>;
第三:在模板中的默认参数类型中,如果所有模板参数都是缺省,但在类进行实例化的时候,尖括号不可以省略。
如何把类模板作为参数传入函数中
类模板作为参数大致有三种传入方式:
一、直接传入模板对象
void fun(person<string, int>& per)
二、类模板传入方式
template <class T1,class T2>
void fun3(person<T1,T2>& per)
三、整个类模板化
template
void fun4(T& per)
部分代码:
//第一种方式,直接传入模板对象
void fun(person<string, int>& per)
{
per.personShow();
}
//类模板传入方式
template <class T1,class T2>
void fun3(person<T1,T2>& per)
{
per.personShow();
//在函数调用的时候,查看一下传入的T1和T2的类型
cout << typeid(T1).name() << " " << typeid(T2).name() << endl;
}
//整个类模板化
template <class T>
void fun4(T& per)
{
per.personShow();
cout << typeid(T).name() << endl;
}