STL与泛型编程(1)---模板

  1. C++模板简介
  2. 泛型编程
  3. 容器
  4. 一些进阶问题

1.C++模板简介

这里写图片描述

1. C++模板概观

一个简单的例子:取两个数中较大值的函数Max
不得不针对不同的型别提供每一种型别的重载

int Max(int a,int b)
{
    return(a>b)?a:b;
}
long Max(long a,long b)
{
    return(a>b)?a:b;
}
char Max(char a,char b)
{
    return(a>b)?a:b;
}

如果使用模板:
则可以省去一堆冗余代码,从而将函数原型缩减到非常简洁的表达

template<typename T>T Max(T a,T b)
{
    return(a>b)?a:b;
}

2.实例化

这里写图片描述

  • 显式实例化为上面的Max函数例子

2.C++函数模板

1.定义

这里写图片描述

template <typename T>
inline T Max(const T& a,const T& b)
{
    return(a>b)?a:b;
}
  1. 没有实例化之前,检查模板代码本身是否有语法错误
  2. 实例化期间,检查对模板代码的调用是否合法
  3. std::complex没有比较大小的功能‘>’
  4. 不允许自动型别的转化

Max(1,2.0) error
两种解决办法

  1. Max(static_cast(1),2.0)
  2. Max(1,2.0)

2.模板函数的使用

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

3.C++类模板

这里写图片描述

模板定义以关键字template开始,后接模板形参表
与调用函数模板形成对比,使用类模板时,必须为模板形参显式指定实参
每个模板类型形参前面必须带上关键字class或typename
《C++ primer》

一个类模板的例子:Stack

const std::size_t DefaultStackSize = 1024;
template<typename T,std::size_t n = DefaultStackSize> class Stack{
pulic:
    void Push(const T const& element);
    int Pop(T& element);
    int Top(T& element);
private:
    std::vector<T> m_Members;
    std::size_t m_nMaxSize = n;
}

这里写图片描述

这里写图片描述

  • 模板实参也可以是一个int或enum型别的常量(此处是size_t,本质是int型别)
  • 除了copy constructor,如果在类模板中需要使用到这个类本身,应该使用其完整的定义

Push函数定义:

要定义一个类模板的成员函数,则要指明其是一个模板函数

template <typename T,std::size_t nMaxSize>
void Stack<T,nMaxSize>::Push(const T const& element)
{
    if(m_Members.size()>= m_nMaxSize){
    //error handing...
    return;
    }

    m_Members.push_back(element);
}

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

4.操作符重载

这里写图片描述

这里写图片描述

这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://my.oschina.net/juedaiyuer/blog/513555

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值