当前位置: 首页 > news >正文

C++之类模板

关于类模板,有几点值得说明:

        1. 类模板必须显式实例化,

        2. 类不能重载

类模板的特化

        类模板实现特化有几种方式:全特化和半特化(或称偏特化)

假设现在已经实现了一个如下形式的类

template<class T1, class T2>
class Data{
public:Data(){cout << "Data<T1, T2>" << endl;}
private:T1 _d1;T2 _d2;
};template<class T1, class T2>
class Data<T1&, T2*>{
public:Data(){cout << "Data<T1&, T2*>" << endl;}
};

全特化

        全特化将会指定所有模板参数,在调用时如果显示实例化的参数列表的类型和全特化后类模板的类型可以一一对应,那么创建的类将是这个唯一的特化后的类对象

template<>
class Data<int, char>{
public:Data(){cout << "Data<int, char>" << endl;}
private:int _d1;char _d2;
};

偏特化

偏特化有两种形式:指定部分模板参数类型 和 将部分或全部参数指定为指针或者引用类型

        1. 指定部分模板参数类型

template<class T1>
class Data<T1, char>{
public:Data(){cout << "Data<T1, char>" << endl;}
};

        2. 将部分或全部参数指定为指针或者引用类型

template<class T1, class T2>
class Data<T1&, T2*>{
public:Data(){cout << "Data<T1&, T2*>" << endl;}
};

注意:模板的分析一定要配合调用处的情况,

        case1: 调用处的参数不是 引用 或者 指针类型

                    如果参数类型符合特化时声称的参数类型,那么就会调用这个模板

        case2: 调用处的参数是 引用 或者 指针类型

                    如果参数类型符合特化时生成时的类型,而且加上了这个修饰,就会调用这个模板

进一步的说明:

        class Data<T1&, T2*>  中 T1& 并不是想要在类中使用T1这个对象时再加一个引用,而只是想要将template<class T1, class T2>中的 这两个类型进行限制,比如传入的是 <Date&, Date*>类型的参数,只需要那么就会调用2. 将部分或全部参数指定为指针或者引用类型中的特化,而且不会对这个类型再加一层引用! 

类模板的非类型模板参数

类模板在定义的时候,可以传入一个具体类型的模板参数,并且可以选择固定这个模板参数的初始值,C++中限制了这种可以固定参数初始值的类型只能为整型,指针和引用,这种模板参数称为非类型模板参数,

下面只以整型作为非类型模板参数为例作为说明

template<class T, size_t N = 10>
class array{
public:T& operator[](size_t index){assert(index < N);return _array[index];}const T& operator[](size_t index)const{return _array[index];}size_t size()const{return _size;}bool empty()const{return 0 == _size;}private:T _array[N];size_t _size;
};

对于非类型模板参数的说明,

对于上面的代码,如果在主函数中调用如下两句话

array<int> a1;

array<int, 1000> a2; 

 编译阶段将会对这两句话分别推导出两个不同的类,然后实例化出不同类型的对象

更多拓展阅读,请见我的C++面试之模板博客  和 模板的通用知识点(挖坑!!!!!)

http://www.xdnf.cn/news/829.html

相关文章:

  • 定制化突围:遨游防爆手机的差异化竞争策略
  • 实战|使用环信Flutter SDK构建鸿蒙HarmonyOS应用及推送配置
  • vue MarkdownIt标签多出了<p>标签导致高度变丑
  • 前端路由缓存实现
  • ServletContextAttributeListener 的用法笔记250417
  • MYSQL “Too Many Connections“ 错误解决
  • 【Python入门】文件读取全攻略:5种常用格式(csv/excel/word/ppt/pdf)一键搞定 | 附完整代码示例
  • Java基础系列-LinkedList源码解析
  • Vue项目Webpack Loader全解析:从原理到实战配置指南
  • MYOJ_11700(UVA10591)Happy Number(快乐数)(超快解法:图论思想解题)
  • JVM考古现场(二十二):降维打击·用二向箔优化内存模型
  • android如何在生产环境中做到详实的日志收集而不影响性能?
  • 算法之贪心算法
  • 【音视频】音视频FLV合成实战
  • Pikachu靶场-CSRF
  • Golang errors 包快速上手
  • 使用Qt multimedia模块实现简易的视频播放器
  • AI在能源消耗管理及能源效率提升中的核心应用场景及技术实现
  • Java性能剖析工具箱
  • 数据结构——反射、枚举以及lambda表达式
  • Qt 性能优化总结
  • Django 实现物联网管理系统的详细方案
  • 使用 OpenRewrite 简化 Java 和 SpringBoot 迁移
  • SDL基础
  • MATLAB 控制系统设计与仿真 - 34
  • 机器学习 | 细说Deep Q-Network(DQN)
  • 学习笔记十六——Rust Monad从头学
  • 【音视频】FLV格式分析
  • 让SQL飞起来:搭建企业AI应用的SQL性能优化实战
  • 2025年4月16日华为留学生笔试第二题200分