文章目录
1 Variadic Templates
第一颗震撼弹!要有模板基础。
前面讲过:分成一个和一包,往往和递归相关。
...
的意思:接受任意变化个数的形参
答PPT上问题:可以并存,没有二义性。一个和一包的形式是更特化的,且3的情况将永远不会被调用
上图是一个HashTable,有关HashTable的内容前面有所提及,后面也会再讲。这里应从蓝色框框的位置入手,随着箭头感受Variadic Templates的强力。
上图是一个Tuple,有关Tuple的内容前面有所提及,后面也会再讲。这里的关键点是,比如一共5个东西,让第1个东西继承后面的一包,即后面4个东西。
总结:
例子:
当数量不限但类型相同时,可使用技巧:Initializer Lists
2 Uniform Initialization
一致性的初始化,在设初值时使用的——变量名后直接放大括号。
所谓逐一分解,可以理解为 Variadic Templates(但实际上并不是)分成一个和一包。每次使用大括号这一种形式,就会与initializer list相关。
有关initializer list<>:用大括号统一设初值的方法的底层为initializer list<>,可以实现参数个数不定,但类型必须相同,不如Variadic Templates那么强力。
要接受“一个和一包”的东西。
注意:Initializer Lists尽量不要窄化类型。
当使用大括号时,initializer list<>会起作用,具体调用例子如下:
源码(还可以参见array源码):
如今所有容器都接受指定任意数量的值用于构造或赋值或insert()或assign();max()和min()也顾意接受任意参数,故initializer list在标准库中有很大的应用。
3 =default,=delete
把这个放在一个比较重要的位置,是因为C++11将BIG THREE变成了BIG FIVE。这里引入BIG FIVE的概念(搬移构造、搬移赋值)
在类的继承中会有价值,一般用在拷贝构造、拷贝赋值、搬移构造、搬移赋值中。
=default表示要编译器默认给的那个,=delete表示不要进行中过程。
使用见下例:
对应的会有一些东西:
4 Alias Template(template typedef)
给类型一个化名,有点像typedef但并不是,相当于对模板typedef。
实战中:
这里介绍一下== template template parameter==,以模板作为模板的参数。
进而引入Type Alias (similar to typedef)。很像typedef。这里用的是using
关于using,总结如下:
5 lambda
lambda可以理解为一个对象,这个对象一般定义成auto类型,用一个中括号表明这是个lambda对象(但后面是一个函数的定义的形式),此对象一般完成一个函数的功能。和函数的不同之处是:lambda的箭头后面才是返回类型。
最简形式如下:
例子:
一些小细节:
1 Spaces in Template Expressions
C++11中,模板可以拿掉后面的空格了。即不用非要打上一个空格来空开。
2 nullptr and std:nullptr_t
在之前的版本,NULL倍define成0.。故空指针和数值0有时会产生二义。C++11使用nullptr而不是0或NULL来指定指针不引用任何值(这与具有未定义的值不同)。此新功能特别有助于避免将空指针解释为整数值时发生的错误。因此,笔者认为,现在最好改掉曾经的习惯,在想用NULL时改使用nullptr。
3 Automatic Type Deduction with auto
auto关键字:让编译器来进行参数的类型。不建议经常使用这个,自己最好完全知道变量的类型,不用这个屠龙宝刀,尽量只在类型超级长的时候懒得打时才使用auto。
4 explicit for ctors taking more than one argument
explicit的作用时禁止类型转换,之前的版本如下例:
之前只对单一实参有效,C++11对任何多个实参都可。
5 range-based for statement
for循环的特殊形式:
注:explicit有特殊情况,auto时会发生类型的转换,这里要小心
6 noexcept
noexcept和“异常”相关。对一个函数后面大括号前面写上noexcept,表示保证这个函数不会丢出异常。
发生的情况:如标准库的vector和deque
7 override
应用于虚函数。子类对父类的继承,使用override可以让子类告诉编译器,要完全复写父类的虚函数,避免错误。
8 final
用在不允许继承的类或不允许被复写的虚函数上。
9 decltype
定义一个类型,让这个类型表示一个表达式
声明返回类型:一个表达式的类型
在元编程(模板)中有很多的应用
对lambda进行传递