一..模板函数
(2)用模板定义函数
template <typename T0,typename T1,typename T2> T0 print(T1 arg1, T2 arg2) //arg1和arg2是两个形参 { cout<<arg1<<" "<<arg2<<endl; }
(3)调用模板函数
print<void,int,int>(23,44); //<>里是实例化T0和T1和T2的数据类型(省略时,编译器根据实参自动判断)
二..模板类
template<class T>
class Operate{
public:
static T add(T a,T b){
return a+b;
}
static T Mul(T a,T b){
return a*b;
}
static T Judge(T a,T b=1){
if(a>=0)
return a;
else
return a/b;
}
};
注意:
template<class T>与template<typename T>,,class和typename是等价的,都是类型的含义,
####################################分割线################################
参数可变模板函数:
// Arguments是模板数据类型的一个句柄,用户可随便写,args则是递归的句柄,每次返回下一个参数值
template <typename... Arguments> returntype functionname(Arguments... args);
#include<iostream>
#include<cstdarg>
using namespace std;
//用来终止递归并处理包中最后一个元素
template<typename T>
void print(const T& t)
{
cout << t;
}
template<typename T, typename...Args>
void print(const T& t, const Args&...rest)
{
cout << t << " "; //打印第一个实参
print(rest...); //递归调用,打印其它实参
}
int main()
{
print("Harris", 2, 3.14f, "April", 42); //输出:"Harris" 2 3.14f "April" 42
cout << endl;
return 0;
}
参数可变模板类:
template<typename... Arguments> class classname;
// Arguments 是参数包。 类 classname 可以接受参数数目可变。
#include<iostream>
#include<cstdarg>
using namespace std;
template<typename...Types>
class Tuple
{
};
Tuple<> t0;
Tuple<int> t1;
Tuple<int, string> t2;