泛型,是一种将类型参数化以达到代码复用的技术,C++中使用模板来实现泛型
模板没有被使用时,是不会被实例化出来的
模板的声明和实现如果分离到.h和.cpp中,会导致链接错误
.h文件不参与编译,它的作用就是替换.编译的时候会通过,但是链接的时候,会真正的去找函数的地址,找不到
模板的声明和实现统一放到一个.hpp文件中
使用的时候,只需要导入.hpp文件
#include "Swap.hpp"
代码示例:
void swapValues(int &v1, int &v2) {
int tmp = v1;
v1 = v2
v2 = tmp;
}
// 函数重载
void swapValues(double &v1, double &v2) {
int tmp = v1;
v1 = v2
v2 = tmp;
}
泛型
// 将类型参数化 class == typename
template <class T> void swapValues(T &v1, T &v2) {
T tmp = v1;
v1 = v2
v2 = tmp;
}
仿函数使用示例
double a = 10.4;
double b = 20.5;
swapValues(a,b);
cout << "a = " << a << "b =" << b << endl;
泛型函数使用示例
double a = 10.4;
double b = 20.5;
// 将类型参数化,类型一般也传过去
swapValues<double>(a,b);
cout << "a = " << a << "b =" << b << endl;
int c = 10;
int d = 20;
swapValues<int>(a,b);
通过断点,反汇编查看,函数调用地址不一样,说明泛型原理是编译器生成了两个函数
call swapValues<int> (0DB1429h)
call swapValues<double> (0DB141Fh)
多参数模板
template <class T1, class T2>
void display(const T1 &v1, const T2 &v2){
cout << v1 << endl;
cout << v2 << endl;
}
// 调用示例
display(20,1.5)