类模板(class template) 详解 及 代码

本文地址: http://blog.csdn.net/caroline_wendy/article/details/16906827

类模板(class template)需要添加模板参数(template parameter), 即最前面添加"template <template T>";

把所有需要使用模板类型的位置, 使用"T"代替; 使用时需要填加"Class<T>",指定模板参数;

在定义类的成员函数(member function)时, 也需要添加类的模板参数"template <template T>",

并且在声明函数的归属类时, 类需要转换为模板类, 即"Class::"转换为"Class<T>::";

如果在类中, 如果使用本类对象, 即当前对象, 则可以不添加模板参数(添加也不没有问题);

其余注意初始化列表"initializer_list"的用法, 和前缀++或--与后缀++或--在重载时的区别;

代码如下:

/*   * cppprimer.cpp   *   *  Created on: 2013.11.21   *      Author: Caroline   */    /*eclipse cdt, gcc 4.8.1*/    #include <iostream>  #include <vector>  #include <initializer_list>  #include <memory>  #include <cstddef>    template <typename T> class BlobPtr;  template <typename T> class Blob;    /*Blob: Binary Large OBject*/  template <typename T> class Blob {    friend class BlobPtr<T>;  public:     typedef T value_type;   typedef typename std::vector<T>::size_type size_type;     Blob ();    Blob (std::initializer_list<T> il); //可以使用初始化列表, {}   size_type size() const { return data->size(); }      bool empty() const { return data->empty(); }     void push_back (const T &t) { data->push_back(t); }      void push_back (T &&t) { data->push_back(std::move(t)); } //右值操作     void pop_back ();   T& back ();     T& operator[] (size_type i) ;  private:     std::shared_ptr<std::vector<T> > data;      void check (size_type i, const std::string &msg) const; //验证给定的索引  };    template <typename T>  Blob<T>::Blob () : data(std::make_shared<std::vector<T>>()) {}    template <typename T>  Blob<T>::Blob (std::initializer_list<T> il) :          data(std::make_shared< std::vector<T> >(il)) {}    /*验证给定的索引*/  template <typename T>  void Blob<T>::check (size_type i, const std::string &msg) const  {     if (i >= data->size())       throw std::out_of_range (msg); //抛出异常  }    template <typename T>  T& Blob<T>::back ()  {   check (0, "back on empty Blob");      return data->back ();  }    template <typename T>  T& Blob<T>::operator[] (size_type i)  {   check (i, "subscript out of range");      return (*data)[i];  }    template <typename T>  void Blob<T>::pop_back ()  {    check (0, "pop_back on empty Blob");      data->pob_back ();  }    template <typename T>  class BlobPtr {  public:   BlobPtr () : curr (0) {}    BlobPtr (Blob<T> &a, size_t sz=0) : wptr(a.data), curr (sz) {}   T& operator* () const {         auto p = check (curr, "dereference past end");       return (*p) [curr];     }   BlobPtr& operator++ (); //前缀操作符   BlobPtr& operator-- ();     BlobPtr operator++ (int); //后缀操作符     BlobPtr operator-- (int);  private:     std::shared_ptr<std::vector<T>> check (std::size_t, const std::string&) const;      std::weak_ptr<std::vector<T>> wptr;     std::size_t curr;  };    template <typename T>  std::shared_ptr<std::vector<T>>  BlobPtr<T>::check (std::size_t i, const std::string& msg) const  {     auto ret = wptr.lock (); //判断wptr是否绑定了Blob     if (!ret)       throw std::runtime_error ("unbound BlobPtr");     if (i >= ret->size ())       throw std::out_of_range (msg);      return ret;  }    template <typename T>  BlobPtr<T>& BlobPtr<T>::operator++ () {    check (curr, "increment past end of BlobPtr"); //先判断后加    ++curr;   return *this;  }    template <typename T>  BlobPtr<T>& BlobPtr<T>::operator-- () {    --curr; //先减之后, 如果为0, 再减就是大整数   check (curr, "decrement past begin of BlobPtr"); //先减后判断      return *this;  }    template <typename T>  BlobPtr<T> BlobPtr<T>::operator ++(int)  {   BlobPtr ret = *this;   ++*this; //使用重载的前缀++    return ret;  }    template <typename T>  BlobPtr<T> BlobPtr<T>::operator --(int)  {   BlobPtr ret = *this;   --*this; //使用重载的前缀--    return ret;  }    int main (void) {     std::cout << "Hello Mystra!" << std::endl;    Blob<int> ia;     Blob<int> ia2 = {0, 1, 2, 3, 4};     std::cout << "ia2[2] = " << ia2[2] << std::endl;   BlobPtr<int> pia = ia2;      std::cout << "*(++pia) = " << *(++pia) << std::endl;   return 0;  }  

转载于:https://blog.51cto.com/spikeking/1388001

C++ - 类模板(class template) 详解 及 代码相关推荐

  1. c++ 中pair类模板的用法详解

    pair: 头文件:#include<utility> 类模板:template <class T1, class T2> struct pair 参数:T1是第一个值的数据类 ...

  2. [设计模式](十):策略模式(Strategy)与模板模式(Template)详解及二者间区别介绍(两种父子类行为模式)

    这次要说的两个模式,都是行为模式,指的是在程序运行过程中,经过经验总结的行为开发模式. 其次,行为模式再按照类与类间关系的划分,可以划分为四个类型:父子关系(2种).独立类间关系(4种).类自身状态( ...

  3. C++ 类模板(template)详解

    目录 1.类模板的使用 1.1为什么需要类模板 1.2类模板定义 1.3单个类模板的使用 2.继承中类模板的使用 2.1父类是一般类,子类是模板类 2.2子类是一般类,父类是模板类 2.3父类和子类都 ...

  4. python string模块template_Python - 定制pattern的string模板(template) 详解

    定制pattern的string模板(template) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28625179 s ...

  5. Python的Django框架中forms表单类的使用方法详解2

    用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...

  6. easycode 表配置_idea的easyCode的 MybatisPlus模板的配置详解

    EasyCode 插件 EasyCode 插件 是一款根据表结构生成代码的很方便的Idea插件, 强烈推荐. 并且可以自定义模板来控制生成的类 我在使用的过程中发现一些问题,现在把解决办法记录下来, ...

  7. Django 基于类的通用视图详解

    原文出处:https://segmentfault.com/a/1190000005685454 Django 学习小组:基于类的通用视图详解(一) 通过三周的时间我们开发了一个简单的个人 Blog, ...

  8. c++之模板初阶详解!

    c++之模板初阶详解 文章目录 c++之模板初阶详解 泛型编程 函数模板 函数模板概念 函数模板格式 模板的原理 函数模板的实例化 模板实例化的个数 对于同不同类型的传参! 如何处理这个问题呢? 关于 ...

  9. ecshop模板smarty foreach详解

    Smarty目录: /libs Smarty的功能类目录 /tempalates 模板文件目录 /templates_c 模板缓存文件目录 /configs 配置文件目录 /cache 缓存文件目录 ...

最新文章

  1. 2020年李永乐线性代数强化笔记-向量
  2. Dynamics CRMのアップデートインポートツール移植的准备步骤与有用的网页
  3. VC++中的char,wchar_t,TCHAR(转载)
  4. 技术干货 | 轻松两步完成向 mPaaS 小程序传递启动参数
  5. redis有序集合sorted set详解
  6. python在线朗读-使用python编写一个语音朗读闹钟功能的示例代码
  7. 找寻创业赛事活动有哪些靠谱的创业赛事平台?
  8. MongoDB 数据库导出数据
  9. 电路设计与仿真各种类软件工具介绍
  10. 前端怎么把word文档转换成HTML格式
  11. 基于Kinect Azure的多相机数据采集(一)
  12. outlook2007打开eml格式文件
  13. 计算机考研最简单的专业,计算机专业有必要考研吗?计算机考研简单的校园都有哪些...
  14. MKS Robin E3D V1.1 Klipper固件使用说明书
  15. OCJP(1Z0-851) 模拟题分析(四)
  16. 涂抹mysql笔记-数据导出导入
  17. Swift-ScrollView轮播图的简易封装和使用
  18. 改变中国软件教育,我们正在行动
  19. 地图兴趣点搜索三(ES相关性得分参数调整)
  20. 彩云在南,本命年在北(记云南之旅)

热门文章

  1. oracle日期与字符串的相互转化
  2. 浅谈-tomcat中的项目之间的访问
  3. Java高并发编程详解系列-线程上下文设计模式及ThreadLocal详解
  4. centos8搭建k8s集群
  5. python设计模式2-工厂方法模式
  6. 变形 圆形_中山125T圆形玻璃钢冷却塔现场安装
  7. Django 入门篇一
  8. 关于ggplot2的一些用法
  9. 润乾数据集调用postgresql存储过程
  10. 腾讯优测-优社区干货精选 |安卓适配之Camera拍照时快门咔嚓声