引言
在c++入门中,很多人会接触swap(int&, int&)这样的函数类似代码如下:
这个函数只支持int参数,那么float、long等怎么办呢,函数重载需要好几个函数,很麻烦,我们可以使用模板
函数模板
模板函数定义的一般形式如下所示:
template <typename 类型占位符> 返回值类型占位符 函数名(参数列表) { 函数的主体 }
注意:typename等价于class
#include <iostream>
template<typename T> void swap(T& t1, T& t2) { //函数模板的定义
T tmpT;
tmpT = t1;
t1 = t2;
t2 = tmpT;
}
int main() {
int num1 = 1, num2 = 2;
swap<int>(num1, num2);//函数模板的调用
std::cout << "num1=" << num1 << "," << "num2=" << num2 << std::endl;
return 0;
}
如果函数模板写在不同文件中,在.h文件的尾部要导入.cpp文件
类模板
格式为:
template<class 形参名,class 形参名,…>
class 类名{ ... };
#include <iostream>
//类模板的定义
template<class T,class T1>
class A {
public:
A(T a, T1 b) :m_i(a), m_f(b) {}
T m_i;
T1 m_f;
void print() {
std::cout << m_i << std::endl;
std::cout << m_f << std::endl;
}
T print1() {
return m_i + 100;
}
};
int main() {
A<int, float> aa(10,55.6);//创建对象
aa.print();
int x = aa.print1();
std::cout << "x=" << x<<std::endl;
return 0;
}
如果在类模板外实现函数体(h和cpp文件分开)时,注意书写格式:
template<class T,class T1> void A<class T,class T1>::print() { }
说明:template<class T,class T1> 是模板帽子
A<class T,class T1> 是编译后相应的类名
函数模板作为类模板成员
#include <iostream>
template<class T>
class A {
public:
A(T a) :m_i(a){}
T m_i;
//成员函数模板
template <class T1>
void Func(T1 t) {
std::cout << t<<std::endl;
}
};
int main() {
A<int> aa(10);
aa.Func(89.6); //成员函数模板Func被实例化
return 0;
}