泛型:将类型参数化以达到代码复用的技术。
C++使用模板实现泛型
先看下面代码
class Point { private: int m_xPosition; //记录x轴坐标 int m_yPosition; //记录y轴坐标 public: Point(int x = 0, int y = 0) : m_xPosition(x), m_yPosition(y) {} //构造函数 初始化 const Point operator+(const Point& point) const { //运算符重载 + return Point(this->m_xPosition + point.m_xPosition, this->m_yPosition + point.m_yPosition); } Point& operator=(const Point& point) { //运算符重载 = this->m_xPosition = point.m_xPosition; this->m_yPosition = point.m_yPosition; return *this; } }; int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } Point add(Point a, Point b) { return a + b; }再看看函数模板怎么做
#includeclass Point { private: int m_xPosition; //记录x轴坐标 int m_yPosition; //记录y轴坐标 public: Point(int x = 0, int y = 0) : m_xPosition(x), m_yPosition(y) {} //构造函数 初始化 const Point operator+(const Point& point) const { //运算符重载 + return Point(this->m_xPosition + point.m_xPosition, this->m_yPosition + point.m_yPosition); } Point& operator=(const Point& point) { //运算符重载 = this->m_xPosition = point.m_xPosition; this->m_yPosition = point.m_yPosition; return *this; } }; template T add(T a, T b) { return a + b; } int main(void) { Point point(10, 20); //正规用法 add (point, point); add (1, 2); add (2.2, 3.2); //不那么正规的用法 add(point, point); add(1, 2); add(2.2, 3.2); return 0; } 如果你想处理不同类型的数据的话,可以这样写
templateT add(T a, A b) { return a + b; }
函数模板的编译细节
编译器会将C++中的每个.cpp文件单独编译成.obj文件,再把所有的.obj文件链接起来变成一个.exe文件。假设,main.cpp中使用了函数add,而函数add的定义在add.cpp中,那么main.cpp在编译的过程中,任何知晓函数add的地址呢?(因为每个文件单独编译)真相就是编译过程中会先提供一个假的地址,在链接的过程中再进行修正。
模板有个特性,那就是只有某个具体的类型调用了函数模板的时候,才会生成那个类型的函数定义。假设你在main.cpp 包含了模板add的头文件,调用了int型的add函数,可是再模板add.cpp中,由于并没有任何类型的函数add生成,所以编译过程中没有add函数。导致的结构就是,main.obj中的add函数地址是假的,而真的add函数没有生成,从而导致链接错误。
所以,目前的结果就是,在头文件中,我们最好把函数模板的声明和定义写在一起。
当然我们也可以想一些办法让它们看似分开
//func.h #ifndef _FUNC_H //防止头文件重复包含 #define _FUNC_H templateT add(T a, T b); #define _FUNC_CPP //引入头文件func.cpp #include "func.cpp" #endif #ifdef _FUNC_CPP templateT add(T a, T b) { return a + b; } #endif // _FUNC_CPP 这个方法只是我个人的方法,仅供参考。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)