现代 C++ 编程实战
吴咏炜
前 Intel 资深软件架构师
34196 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
加餐 (1讲)
现代 C++ 编程实战
15
15
1.0x
00:00/00:00
登录|注册

24 | Boost:你需要的“瑞士军刀”

C++ Template Metaprogramming
Boost C++ Libraries
Hana 的基本用法
编译期使用的数据类型和函数
替代 getopt 的选项处理库
使用 boost::scope_exit 来管理资源
使用 Boost.Conversion 的 lexical_cast
boost::swap
boost::noncopyable
boost::core::demangle
addressof, enable_if, is_same, ref
使用 Boost.TypeIndex 解决调试期 typeid 的问题
typeid vs. type_id vs. type_id_with_cvr
编译器落后于标准时使用 Boost 的替代品
在 Windows、Linux 和 macOS 上的安装方法
Boost 对 C++ 标准库的影响
由 C++ 专家支持
经过同行评审的、可移植的 C++ 源码库
参考资料
课后思考
内容小结
Boost.Hana
Boost.Program_options
Boost.ScopeExit
Boost.Conversion
Boost.Core
Boost.TypeIndex
Boost 的安装
Boost 概览
Boost:你需要的“瑞士军刀”

该思维导图由 AI 生成,仅供参考

你好,我是吴咏炜。
我们已经零零碎碎提到过几次 Boost 了。作为 C++ 世界里标准库之外最知名的开放源码程序库,我们值得专门用一讲来讨论一下 Boost。

Boost 概览

Boost 的网站把 Boost 描述成为经过同行评审的、可移植的 C++ 源码库(peer-reviewed portable C++ source libraries)[1]。换句话说,它跟很多个人开源库不一样的地方在于,它的代码是经过评审的。事实上,Boost 项目的背后有很多 C++ 专家,比如发起人之一的 Dave Abarahams 是 C++ 标准委员会的成员,也是《C++ 模板元编程》一书 [2] 的作者。这也就使得 Boost 有了很不一样的特殊地位:它既是 C++ 标准库的灵感来源之一,也是 C++ 标准库的试验田。下面这些 C++ 标准库就源自 Boost:
智能指针
thread
regex
random
array
bind
tuple
optional
variant
any
string_view
filesystem
等等
当然,将来还会有新的库从 Boost 进入 C++ 标准,如网络库的标准化就是基于 Boost.Asio 进行的。因此,即使相关的功能没有被标准化,我们也可能可以从 Boost 里看到某个功能可能会被标准化的样子——当然,最终标准化之后的样子还是经常有所变化的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Boost 是一个经过同行评审的、可移植的 C++ 源码库,由 C++ 专家支持,既是 C++ 标准库的灵感来源,也是其试验田。Boost 包含多个库,如智能指针、thread、regex 等,且很多库已进入 C++ 标准。Boost 的安装在主要开发平台上变得更加便捷。Boost.TypeIndex 是一个轻量级库,解决了使用模板时精确知道表达式或变量类型的问题。Boost.Core 提供了一些通用工具,如 `addressof`、`enable_if`、`is_same` 等,其中一些已进入 C++ 标准。Boost 是一个强大的工具集,为 C++ 开发提供了丰富的功能和便利的工具。 Boost::core::demangle 提供了将 `typeid` 返回的内部名称“反粉碎”(demangle)成可读形式的功能。Boost::noncopyable 提供了声明类为不可拷贝的简单方式。Boost::swap 简化了对不知道类型的对象执行交换操作的代码。Boost.Conversion 解决了标准 C++ 中类型之间转换不够方便的问题,提供了 `lexical_cast` 等功能。Boost.ScopeExit 提供了简单的资源管理方式,支持 C++98 的代码。Boost.Program_options 解决了处理命令行参数的问题,提供了更方便的选项处理方式。 Boost.Hana 是一个使用了 C++11/14 实现技巧和惯用法的新库,提供了一整套供编译期使用的数据类型和函数。Hana 本质上以类似普通的运行期编程的写法,来做编译期的计算,展示了很多有趣的用法。尤其值得一看的是,文档中展示了如何利用 Hana 提供的机制,来自己定义 `switch_`、`case_`、`default_`,使得代码可以通过编译。 总之,Boost 提供了丰富的功能和便利的工具,涵盖了 C++ 开发中常见的问题和需求,为开发者提供了强大的支持和便捷的解决方案。Boost.Hana 则是一个使用了 C++11/14 实现技巧和惯用法的新库,提供了一整套供编译期使用的数据类型和函数,展示了很多有趣的用法。 参考资料: [1] Boost C++ Libraries. https://www.boost.org/ [2] David Abarahams and Aleksey Gurtovoy, *C++ Templat

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《现代 C++ 编程实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(6)

  • 最新
  • 精选
  • 风羽星泉
    老师的文章里提到:“实现类似(Boost.ScopeExit)的功能在 C++11 里相当容易“。能教我怎么实现吗?

    作者回复: 定义一个RAII类模板,构造时接受一个lambda表达式,把它存到成员里。析构时调用这个成员就行啦。

    2020-01-20
    7
  • Geek_Frank
    您好,POCO库您觉得怎么样?

    作者回复: 不熟,没法给出技术评价。 从理念上来说,我不喜欢大框架。小而精的东西更容易和其他东西组合。而框架的东西,一旦用了某一个,就很难在重叠的领域用其他的东西,总体不见得有利。也就初期上手可能容易些吧,从学习的角度,还是可以看看。

    2020-03-05
    3
    1
  • tt
    老师,通过看某些源代码来学习现代C++,看Boost库的,是一个好的开始不?

    作者回复: 可以看自己感兴趣的实现。都看(太多了)没必要。另外,Boost很多库都是前C++11的,有些技巧现在已经不必要了,这点留意一下。

    2020-01-20
    1
  • Ben
    吴老师,我希望分享一个踩坑经历。在mac brew 安装之后大概率要使用pkg-config 这个命令告诉编译器 Armadillo的位置。要不然安装之后cmake 找不到。

    作者回复: 奇怪,我没有遇到类似问题…… 这是我在第 23 讲代码的 cmake 输出: -- Found Armadillo: /usr/local/include (found version "11.2.3") -- Found Boost: /usr/local/lib/cmake/Boost-1.78.0/BoostConfig.cmake (found version "1.78.0") -- Found GMP: /usr/local/include

    2022-08-26归属地:上海
  • weing
    老师,有推荐的C++ 内存池库吗? 想在C++代码里使用内存池进行内存管理

    作者回复: 内存池基本上是一种定制的东西……我有计划补充一下这方面的内容。如果急着看这方面的内容的话,可以看一下我个人网站上的英文文章 http://wyw.dcweb.cn/

    2022-02-11
  • Sochooligan
    来了,来了。
    2020-01-20
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部