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;
}

 

四.泛型编程原理

 

posted @ 2019-07-02 10:01  言午丶  阅读(203)  评论(0编辑  收藏  举报