stl_config.h的各种组态

在阅读侯捷老师的《stl源码剖析》,了解到组态这个东西,说是其书上所列的几个组态常量是用来区分编译器对c++ Standard的支持程度,以下的组态所关系到的代码都是template参数推导,偏特化之类的问题

  • 组态一:__STL_STATIC_TEMPLATE_BUG

测试在class template中拥有static data members

组态二:__STL_CLASS_PARTIAL_SPECIALIZATION

测试 class template partial specialization–在class template 的一般化设计之外,特别针对某些template参数做特殊设计也就是说测试编译器是否支持模板偏特化,支持就定义

组态三:__STL_FUNTION_TMPL_PARTIAL_ORDER

测试对函数模板的支持

组态四:__STL_EXPLICIT_FUNTION_TMPL_ARGS

整个SGI STL中没有用到这一常量定义

组态五:__STL_MEMBER_TEMPLATE

测试模板类中可否再有模板成员,能否模板嵌套

组态六:__STL_LIMITED_DEFAULT_TEMPLATES

测试template参数是否可以根据前一个template参数设定默认值

例如 template<class T,class Sequence=deque<T>>

组态七:__STL_NON_TYPE_TMPL_PARAM_BUG

测试class template可否拥有 non—type template

template <class T,class Ref,class Ptr, size_t sz>

组态八:__STL_NULL_TMPL_ARGS

整个组态常量常常出现在友元函class template的friend函数声明

template <class T,class Sequence=deque<T>>
class stack{friend bool operator==__STL_NULL_TMPL_ARGS(const stack&,const stack&);friend bool operator<__STL_NULL_TMPL_ARGS(const stack&.const stack&);...
}
//__STL_NULL_TMPL_ARGS展开为<>
template <class T,class Sequence=deque<T>>
class stack{friend bool operator==<>(const stack&,const stack&);friend bool operator< <>(const stack&.const stack&);...
}

组态九:__STL_TEMPLASTE_NULL

<Stl.config.h>定义了一个_STL_TEMPLATE_NULL,如下

#ifdef _STL_CLASA_PAITIAL_SPECIALIZATION

#define _STL_TEMPLATE_NULL template<>

#else

#define _STL_REMPLATE_NULL

#endif

template <class key>struct hash{...};
_STL_REMPLATE_NULL struct hash<char>{...};
_STL_REMPLATE_NULL struct hash<unsigned char>{...};
//如果编译器支持偏特化那么就可以使用,_STL_REMPLATE_NULL代替template<>
template <class key>struct hash{...};
template<> struct hash<char>{...};
template<> struct hash<unsigned char>{...};

临时对象的产生

  • 所谓临时对象是一种无名对象,他的出现不会不在程序的预期之下,(例如任何pass by value,都会引发copy操作,于是形成临时对象,往往造成效率的负担。)但是有时候可以制造一些临时对象,却使程序非常干净。

  • 如何可以制造临时对象:在性别名称之后直接加一对()并且可以给予初值,shape(3,5),int(8),其意义是调用相应的构造函数,且不指定对象名称。STL常常利用此技巧应用于仿函数与算法的搭配

template<typename T>
class print{public:void operator()(const T& elem){cout<<elem<<" ";}
};
int main(){int ia[6]={0,1,3,4,5,6};vector<int>iv(ia,ia+6);for_each(iv.begin(),iv.end(),print<int>());//print<int>()是一个临时对象,当for_each结束时这个临水对象也结束了它的生命
}

静态常量整数成员在class内部直接初始化

template<typename T>
class test{public:static const int a=5;static const long b=4l;static const char c='c';
};

increment/decrement/dereference操作符

  • 关于递增,递减,取值操作符的重载,我在前面的容器章节手写过:写文章-CSDN博客

前开后闭区间表示法

  • 任何一个STL算法,都需要由一对迭代器所标示的区间,用于表示操作范围,这一对迭代器获得的是前闭后开的区间,也就是说end()所指的是最后一个元素的下一个元素。

funtion call 操作符

  • 函数操作符也可以被重载

  • STL算法都提供两个版本,一个用于一般状况,一个用于特殊状况(也就是需要用户来指定某个条件或者某个策略)STL算法的特殊版本接受的“策略”,“方法”,“条件”都是以仿函数的形式呈现的,所谓仿函数就是用起来像函数一样,如果你针对某个class重载了operator(),它就成为了一个仿函数。至于要成为一个可配接的仿函数,就需要做一些操作(后面详细分析)

template<class T>
class puls{T operator()(const T&x,const T&y){return x+y;}
};
//有两种使用方式,一种是创建对象,一种是创建临时对象】
int main(){plus<int>plusobj;cout<<plusobj(3,5);cout<<plus<int>()(3,5);//创建临时对象
}

【c++从菜鸡到王者】第六篇:详解晦涩难懂的c++语法相关推荐

  1. 重磅!阿里首次全面公开展示AI布局(附布局图/成绩单/六产业详解)

    01 阿里首次公开展示AI布局 12月20日,阿里云云栖大会·北京峰会召开,作为2017年阿里云栖大会最后一场,阿里做足了噱头,系列预热"重磅"."史无前例"等 ...

  2. element布局容器大小_Flutter完整开发实战详解(十六、详解自定义布局实战)

    本篇将解析 Flutter 中自定义布局的原理,并带你深入实战自定义布局的流程,利用两种自定义布局的实现方式,完成如下图所示的界面效果,看完这一篇你将可以更轻松的对 Flutter 为所欲为. 文章汇 ...

  3. 服务器的全部作用,王者荣耀有哪些服务器_王者荣耀全部服务器功能详解_玩游戏网...

    王者荣耀中有多种服务器,除了玩家们最常见的正式服和体验服,还有抢先服.中转服.比赛服.内测服,每个服务器的功能都是不一样的,我们平时常见的一些爆料内容其实都是这些不常见的服务器中流传出来的,小编这里带 ...

  4. 并发王者课-铂金2:豁然开朗-“晦涩难懂”的ReadWriteLock竟如此妙不可言

    欢迎来到<并发王者课>,本文是该系列文章中的第15篇. 在上篇文章中,我们介绍了Java中锁的基础Lock接口.在本文中,我们将介绍Java中锁的另外一个重要的基本型接口,即ReadWri ...

  5. 第一行代码学习笔记第六章——详解持久化技术

    知识点目录 6.1 持久化技术简介 6.2 文件存储 * 6.2.1 将数据存储到文件中 * 6.2.2 从文件中读取数据 6.3 SharedPreferences存储 * 6.3.1 将数据存储到 ...

  6. 二十六万字详解bat文件

    批处理文件,在DOS和Windows(任意)系统中,.bat文件是可执行文件,由一系列命令构成,其中可以包含对其他程序的调用.这个文件的每一行都是一条DOS命令(大部分时候就好像我们在DOS提示符下执 ...

  7. 56.深度解密五十六:详解DSP营销推广及实战中的相关问题

    网络营销推广技术.技巧深度解密(五十六)指南: 1.本文档适合零基础以及互联网营销推广工作者,主要讲解DSP广告在实战中的相关问题. 2.原创版权文档,任何抄袭或者全部.部分模仿都是侵权行为. 3.敬 ...

  8. 王者荣耀专区系统服务器繁忙,王者荣耀转区系统规则介绍 王者荣耀转服问题详解...

    王者荣耀转区有哪些规则?王者荣耀转区功能终于正式上线了,作为一个玩家们期待了很久的功能,本次正式上线也肯定有着不少问题出现.目前玩家们关心的可转服分区服.具体转移的内容以及最重要的价格等内容都已经正式 ...

  9. JBPM学习(六):详解流程图

    概念: 流程图的组成: a. 活动 Activity / 节点 Node b. 流转 Transition / 连线(单向箭头) c. 事件 1.流转(Transition) a) 一般情况一个活动中 ...

最新文章

  1. SVG 基础知识 回顾
  2. show status like “table%“ 分析mysql表锁定
  3. mysql error 1449_MySql错误:ERROR 1449 (HY000)
  4. hive java udf_UDF_Hive教程_田守枝Java技术博客
  5. 算法竞赛入门经典 第二章总结
  6. 自省的力量-我看《走出软件作坊》
  7. python直接用解释器编写和编辑器的区别_Python语言编译器与解释器
  8. bzoj3083 遥远的国度
  9. linux ipc 信号量,linux ipc信号量
  10. Python实现对给定的列表中连续数字的寻找
  11. Mysql之左连接右连接内连接——示例
  12. IDEA 热部署插件 JRebel 激活
  13. 破解WEP密钥过程全解(上)
  14. BLM业务模式设计之战略控制
  15. 服务器搭建邮件自动回复,爆笑的邮件自动回复内容,邮件自动回复心理
  16. websocket 技术文档
  17. 夏季瑟瑟发抖的前端又赶上一波裁员潮,其实前端才是宝
  18. JAVA使用POI-TL通过Word模板生成Word文件
  19. javascript 火星文,菊花体,繁体,简体文字转换
  20. ChatGPT超级智能体改写人类未来的宇宙大冒险!|小智ai

热门文章

  1. Python抓取数据具体流程
  2. 基于jQuery的TreeGrid组件
  3. window10下搭建php的运行环境
  4. OJ每日一练文章目录汇总
  5. redux与react-redux
  6. ftl和html的区别?
  7. opencv学习笔记三十六:AKAZE特征点检测与匹配
  8. 软件测试分类(按测试阶段划分)
  9. 【硬件在环Hil联调问题记录1】
  10. Java8之新日期时间篇