引言
在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; }