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;
}
四.泛型编程原理

浙公网安备 33010602011771号