泛型编程与面向对象编程的目标相同,即使重用代码和抽象通用概念的技术更加简单。但是面向对象编程强调编程的数据方面,泛型编程强调的是独立于特定数据类型。
这一篇介绍一下 C++ 编程中与面向对象并列的另一大分支——泛型编程,这一篇主要介绍函数模板、类模板和成员模板三大部分
如有侵权,请联系删除,如有错误,欢迎大家指正,谢谢
泛型编程
模板是泛型编程的一种重要思想,STL(Standard Template Library,标准模板库)是采用模板实现的一个实例
函数模板
对比函数重载(同一作用域内函数名相同,参数列表不同的函数),函数模板只需要一个函数就实现了函数重载的部分功能(参数个数相同类型不同,函数重载需要定义多个同名参数列表不同的函数)
template<typename T, typename Y> // 这也可以写 template<class T, class Y> 此处的 class 和 typename 作用相同 void tfunc(T& t, Y& y) { cout << t << " " << y << endl; } int n = 2; double d = 2.1; tfunc(n, d); // 运行结果:2 2.1
函数模板具体化,函数模板具体化就是将某一(某几)个要处理的类型单独处理,需要单独写一个实现,形式是 template<> void fun(type& t);,函数模板的具体化和普通函数可以同时存在,调用顺序是 普通函数 > 函数模板具体化 > 模板函数
// ====== 测试一:函数模板针对特殊数据类型具体化 ====== struct Node { int val; Node* next; }; // 函数模板 template<typename T> void tfunc(const T& t) { cout << "template: " << t << endl; } // 函数模板具体化(用于处理Node类型数据) template<> void tfunc<Node>(const Node& node) { cout << "template<Node>: " << node.val << endl; } // 函数模板具体化(用于处理int类型数据) template<> void tfunc<int>(const int& n) { cout << "template<int>: " << n << endl; } // 普通函数 void tfunc(const int& n) { cout << "tfunc(): " << n << endl; } double d = 2.1; tfunc(d); // 函数模板未具体化double类型函数,调用模板 Node node{ 2, nullptr }; tfunc(node); // 函数模板具体化Node类型函数,调用函数模板的具体化 int n = 2; tfunc(n); // 函数模板具体化int类型函数,也存在普通函数,调用普通函数 // ====== 测试二:函数模板部分具体化 ====== template<typename T1, typename T2> void tfunc(T1 t1, T2 t2) { cout << typeid(T1).name() << " and " << typeid(T2).name() <<": " << t1 << " " << t2 << endl; } template<typename T1> void tfunc(T1 t1, int i) { cout << typeid(T1).name() << " and " << "int: " << t1 << " " << i << endl; } template<typename T2> void tfunc(long l, T2 t2) { cout << "long and " << typeid(T2).name() << ": " << l << " " << t2 << endl; } template<> void tfunc(short l, int i) { cout << "long and int: " << l << " " << i << endl; } // 分别调用以上四个模板函数 tfunc(char('c'), char('c')); tfunc(char('c'), int(10)); tfunc(long(10), char('c')); tfunc(short(10), int(10));
函数模板实例化,让编译器生成指定类型的函数定义,不用写函数的实现,形式是 template void fun(type& t);