C++03:模板 元编程

实现的功能相同,仅仅是涉及的数据类型不同。模板正是一种专门处理不同数据类型的机制

模板是泛型程序设计的基础

在函数定义时可以不指明具体的数据类型,当函数调用时,编译器根据传入的实参自动推断数据类型,这就是类型的参数化

在C++中能够带有类型参数的可以是函数和类,所以模板分为函数模板和类模板

 

模板是C++支持参数化多态的工具,通常有函数模板和类模板

函数模板针对仅参数类型不同的函数

类模板针对数据成员和成员函数类型不同的类

使用模板能够编写出与类型无关的代码

 

 

模版分为函数模版类模版

按我的理解,C++设计出模版的作用就是把 数据类型和函数功能进行隔离,能够让代码的通用性更高一些,这就是更加适合封装和重用

 

二.函数模板

1.使用

函数模板中,会根据传入实参的类型来替换函数模板中形参

1
2
3
4
5
6
7
8
9
10
//声明
template <class T>
void Swap(T&a ,T&b){
    ...
}
  
template <typename T>
void Swap(T& a,T& b){
  
}

 

1
2
3
//调用
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.使用

类模板中,根据类<>里面的具体类型来替换类模板中形参类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//声明
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){
...
}

 

1
2
3
//调用
A<int> a;
A<string> b;

 

template<typename T> 
class A
{
public:
  T a;  //成员变量
  T b;  //成员变量
  T func(T a,T b);  //成员函数声明    
}

 

 

2.例子

注意:一个模板声明对应一个类,并且要重载不同的类型

 

1
2
3
4
5
6
7
8
9
10
//TestMain.h
  
template <class T>
class A{
  
public:
    A();
    T g(T a,T b);
};

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 @   言午丶  阅读(213)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示