建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表
语法:template <typename T>
声明一个模版,告诉编译器后面代码中紧跟着的T不要报错,T是一个通用数据类型
template<typename T> void mySwap(T &a, T &b) { T temp = a; a = b; b = temp; } void test01() { int a = 10; int b = 20; //利用函数模版交换 //1、自动类型推导 mySwap(a, b); //2、显示指定类型 mySwap<int>(a, b); }
myPrint<>(a, b);
模版并不是万能的,有些特定的数据类型,需要用具体化的方法去做特殊实现
既然选择使用了函数模版,就不要写普通函数,避免二义性
#include <iostream> #include <string.h> using namespace std; //类模版 template<class NameType, class AgeType> class Person { public: Person(NameType name, AgeType age) { this->m_name = name; this->m_age = age; } NameType m_name; AgeType m_age; } //调用 void test01() { Person<string,int>p1("ljw",20); } void main() { test01(); system("pause"); return 0; }
类模版中的成员函数并不是一开始就创建的,而是在调用的时候才创建
//1、指定传入类型 void PrintPerson1(Person<string,int>&p) { p.showPerson(); } void test01() { Person<string,int>p1("ljw",20); PrintPerson1(p1); } //2、参数模版化 template<class T1, class T2> void PrintPerson2(Person<T1, T2>&p); { p.showPerson(); } void test02() { Person<string,int>p2("Jeffrey",19); PrintPerson2(p2); //3、整个类模版化 template<class T> void PrintPerson3(T &p) { p.showPerson(); ) void test03() { Person<string,int>p3("Jeffrey",19); PrintPerson3(p3); }
当类模版碰到继承时,应该注意以下几点:
template<class T> class Base { T m; }; class Son:public Base<int>//必须指定一个类型 {}; template<class T1, class T2> class Son2:public Base<T2> { }; void test02() { Son2<int, char> child1; }
template<class T1, class T2> class Person { public: Person(T1 name, T2 age); T1 name; T2 age; } template<class T1, class T2> Person<T1,T2>::Person(T1 name, T2 age) { this->name=name; this->age=age; }