C++03:模板 元编程
实现的功能相同,仅仅是涉及的数据类型不同。模板正是一种专门处理不同数据类型的机制
模板是泛型程序设计的基础
在函数定义时可以不指明具体的数据类型,当函数调用时,编译器根据传入的实参自动推断数据类型,这就是类型的参数化
在C++中能够带有类型参数的可以是函数和类,所以模板分为函数模板和类模板
模板是C++支持参数化多态的工具,通常有函数模板和类模板
函数模板针对仅参数类型不同的函数
类模板针对数据成员和成员函数类型不同的类
使用模板能够编写出与类型无关的代码
模版分为函数模版和类模版
按我的理解,C++设计出模版的作用就是把 数据类型和函数功能进行隔离,能够让代码的通用性更高一些,这就是更加适合封装和重用
二.函数模板
1.使用
函数模板中,会根据传入实参的类型来替换函数模板中形参
//声明 template <class T> void Swap(T&a ,T&b){ ... } template <typename T> void Swap(T& a,T& b){ }
//调用 int a,b; Swap(a,b);
2.例子
注意:一个模板声明对应一个函数
#include <iostream> #include <vector> using namespace std; template <typename T> inline T const& Max(T const& a, T const& b) { return a < b ? b : a; } int main() { int i = 39; int j = 20; cout << "Max(i,j)= " << Max(i, j) << endl; double f1 = 13.5; double f2 = 20.7; cout << "Max(f1, f2)= " << Max(f1, f2) << endl; string s1 = "Hello"; string s2 = "World"; cout << "Max(s1, s2)= " << Max(s1, s2) << endl; return 0; }
#include <iostream> using namespace std; //模板头,template关键字告诉编译器开始泛型编程 template<typename T> T add(T t1, T t2) //类型参数化为T { return t1+t2; } int main() { cout << add(12, 34) << endl; cout << add(12.2, 45.6) << endl; return 0; }
三.类模板
1.使用
类模板中,根据类<>里面的具体类型来替换类模板中形参类型
//声明 template <class T> template <typename T> class A{ public: T a; T b; T swap(T c,T& d); }; //实现 T A<T>::swap(T c,T& d){ ... }
//调用 A<int> a; A<string> b;
template<typename T> class A { public: T a; //成员变量 T b; //成员变量 T func(T a,T b); //成员函数声明 }
2.例子
注意:一个模板声明对应一个类,并且要重载不同的类型
//TestMain.h template <class T> class A{ public: A(); T g(T a,T b); };
template <class T> A<T>::A(){ } template <class T> T A<T>::g(T a,T b){ return a+b; } int main(){ A<int> a; std::cout<<a.g(1,2)<<std::endl; system("pause"); return 0; }
四.泛型编程原理