从Folly源代码中学习C ++ 11的新功能。
五年前,Facebook发布了名为Folly的C ++库,该库是Facebook内部广泛使用的大量可重用C ++库组件的集合。
但是存在许多成熟的C ++开源库,为什么要引入另一个库呢? 这是其实用程序背后的网站动机:
Folly(在Facebook开放源代码库之后缩写,简称Folly)是一个C ++ 11组件库,在设计时考虑了实用性和效率。 它补充了(而不是与之竞争)Boost等产品,当然还有std
。 实际上,只有在所需的东西不可用或不满足所需的性能概要时,我们才着手定义自己的组件。
例如,这是为什么Folly引入另一个向量类FBVector的详细解释 。 就像Folly开发人员所声称的那样,它是一个C ++ 11组件库,如果您查看它们的源代码,这将完全证实这一点,并且广泛使用了C ++ 11功能,此外,几乎所有新的C ++ 11使用功能。
几年前宣布c ++ 0x时,我以为它不会对C ++语言产生很大的影响,但是我错了,看看Folly的这段代码片段,看起来它是使用一种新语言开发的。
相同的说法几乎涉及所有愚蠢的源代码,其实现看起来与c ++ 03源代码不同。
对于有兴趣掌握C ++ 11新功能的开发人员,更好的方法是发现成熟的库如何使用它们。Folly是探索这些新功能的很好的候选人。 让我们从其源代码中发现其中的一些。
1-自动
C ++ 11使用auto关键字引入了类型推断功能,这意味着编译器在声明时推断变量的类型。 Folly几乎对所有变量声明都使用了auto,这是源代码中的一个示例
使用auto关键字允许花费更少的时间写出编译器已经知道的内容。
2-nullptr
常量0具有常量整数和null指针常量的双重作用.C ++ 11通过引入一个新关键字来充当专有的null指针常量来更正此错误:
在Folly源代码中,所有空指针都由新关键字nullptr表示,没有地方使用常数0。
3- shared_ptr
智能指针不是一个新概念,许多库是在多年前实现的,流行的是boost :: shared_ptr ,新功能是它的标准化,并且不再需要使用外部库来处理智能指针。
Folly广泛使用标准化的共享指针,其源代码中只保留了很少的原始指针。
4-强类型的枚举
C ++中的“传统”枚举会在周围的范围内导出其枚举数,如果同一范围内的两个不同枚举都具有范围定义相同名称的枚举数,则可能导致名称冲突;
C ++ 11引入了enum类关键字。 他们不再在周围的范围内导出其枚举数。 而且,我们现在还可以从枚举继承。
5-静态断言
C ++ 11引入了一种新的方法来测试编译时的断言,它使用new关键字static_assert,此功能对于将条件添加到模板参数非常有用,如Folly源代码中的以下模板类所示:
6-可变参数模板
可变参数模板是一个模板,可以采用任意数量的任意类型的模板参数。 这两个类和函数都可以是可变参数。Folly定义了许多可变参数模板,这是来自Folly源代码的两个可变参数模板函数:
7-基于范围的循环
C ++ 11扩展了for语句,以支持对集合进行迭代的“ foreach”范例。 它使代码更简单,更简洁。 Folly广泛使用此功能,这是Folly的一个示例
8-启动器列表
在C ++ 03中,Initializer列表仅与数组有关,而在C ++ 11中,不再仅针对数组。 接受{} -list的机制是一个函数(通常是构造函数),接受类型为std :: initializer_list <T>的参数 。 这是一个函数接受std :: initializer_list作为参数的示例
这就是它的调用方式
9-无例外
如果一个函数不能引发异常,或者如果该程序未编写为处理该函数引发的异常,则可以将该函数声明为noexcept。
这是Folly源代码中的一个示例
10动
C ++ 11引入了右值引用(用&&指定)的概念,以区分对左值或右值的引用。 左值是具有名称的对象,而右值是不具有名称的对象(临时对象)。 移动语义允许修改右值。
为此,C ++ 11引入了两个新的特殊成员函数: move构造函数和move赋值运算符 。
这是一个很好的文档 ,可以更好地解释移动语义的好处。
11-lambda
C ++ 11提供了创建匿名函数(称为lambda函数)的功能,您可以在此处参考有关此新功能的更多详细信息。
Folly在许多函数中使用它,这是其源代码的示例:
12-明确默认和删除的特殊成员函数
在C ++ 03中,对于不为其自身提供类的类,编译器为其提供默认构造函数,副本构造函数,副本分配运算符( operator=
)和析构函数。 程序员可以通过定义自定义版本来覆盖这些默认值。
但是,对这些默认值的创建几乎没有控制权。 例如,使类本质上不可复制,需要声明一个私有副本构造函数和副本赋值运算符,而不定义它们。
在C ++ 11中,可以明确禁用某些功能。 例如,以下类型是不可复制的,这使代码更加简单和干净。
13-覆写识别码
在C ++ 03中,当打算覆盖基类函数时可能会意外地创建一个新的虚函数。
override
特殊标识符意味着编译器将检查基类,以查看是否存在具有此确切签名的虚函数。 如果没有,编译器将指示错误。
Folly广泛使用此新功能:
14- std :: thread
提供了一个线程类( std::thread
),该类需要一个函数对象以及传递给它的可选参数序列在新线程中运行。
在C ++ 11中,使用线程的工作更加简化,这是来自Folly源代码的定义新线程的新标准方法:
15-无序容器
无序容器是一种哈希表。 C ++ 11提供了四个标准的:
- unordered_map
- 无序集
- unordered_multimap
- unordered_multiset
愚蠢在许多地方使用这些新容器
结论
Folly几乎使用了所有新的C ++ 11功能,探索其源代码将使您对新的C ++功能及其实现方式有了更好的了解。
我鼓励任何对C ++ 11感兴趣的C ++开发人员放下Folly源代码,并发现新语言的强大功能。
From: https://hackernoon.com/learn-from-folly-source-code-the-new-c-11-features-121823fdd525