boost any 实现万能容器_Boost 速查手册(施工中)

挪到了Github上,排版比这里强。也修正了行文。此处不再更新。

wuye9036/BoostLibrariesCheetsheetChn​github.com
44b0af203166d0e0591a3d15ea1e4c2a.png

以下是原文部分

本文的目的在于帮助大家梳理一下Boost中有哪些库,包括那些库是不再需要的,类似的库之间有什么共同点和不同点,以免胡造轮子。

Boost这些库就和鸡啄米一样散地到处都是……

不定期更新,写完为止。

最近更新:5/3/2019

新模板:

关键字,承继关系,语言特性,库依赖,描述(可能包括原理,实现,优缺点,使用建议)

Version: 1.67-1.70

Contract, HOF, YAP, Safe Numerics

Version: 1.66.0

元编程

糊弄编译器

Identity

类型萃取和修饰

Type Traits

这个大家应该很熟悉了,通过它们可以判断类型的特性,比如是不是一个整数类型,是否有符号。它也可以为类型做一些修饰,比如变换到引用类型、常类型等。这个库C++11之后基本上就完全std中的type traits取代了。

但是这个库对一些类型,如成员函数支持不足,也不能做一些更加精细的检查,比如探测类中是否存在某个成员,这时就需要下面几个库进行补充。

Call Traits

这个库可以把一些不能作为函数参数的类型,如数组类型修饰成可以作为参数的类型,比如:

template 

实际上在使用中这个库并不常用,因为大部分情况下A<T>这种都会要求T是值语义的比较多,为啥非要用一个数组或者一个引用进去作死呢?

Callable Traits

这个库是1.66中的新加入库,可以为成员函数活、一般函数或者任意函数对象调整类型修饰,比如

struct 

C++11/14中的add_cv是没办法调整函数的类型修饰的。

TTI

这个库从1.54开始加入,也算是个比较新的库了。它算是对Type Traits的一个补充,一看几个头文件名就知道它是做什么的了:

// ...
#include <boost/has_member_data.hpp>
#include <boost/has_member_function.hpp>
// ...

不过从C++11开始,因为有了Expression SFINAE,以及decltype/declval之类的存在,它的应用场景就没有那么广泛了。

自省

Typeof

获得变量的类型,并支持自动类型变量。C++11之前比GCC的typeof要好用,C++11/14以后它的用途已经可以完全被 decltype, decltype(auto) 和 auto 所取代。

Type Index

C++11开始,标准库中引入了type_index。所以接下来又到了做下面几个概念做近义词辨析的时候了:typeid, std::type_index 和 boost::type_index

最基本的是C++98时代就有的typeid。它在运行时返回一个type_info,其中保存了类型的一些信息,比如name。但是这个对象平时真的没什么卵用,所以C++11开始,加入了type_index,作为type_info的封装,它能够支持比较和hash,这样就能把类型信息存在字典中了 —— 比如字典中可以放上factory method,这样就相当于有了一个比较挫但是能用的动态创建对象的功能。

不过typeid需要打开编译器的RTTI,而且它生成的名字也不太好(特别是函数和模板类型),所以Boost搞了一个自己的Type_index来解决这一些问题,算是是std::type_info的一个增强。

类型检查与约束

Concept Check

这个库从1.19就加入了boost (1.19是2000年发布的 —— 这都TM快20年了),目的就是做Concept的检查,然而用处真的很小 —— 你检查了又能怎么样,出错信息还是巨难看,就和C++11之前的Static Assert一样。

看,Concept是C++98时代的东西了,C++20都还进不来。这么难产的特性,要么没卵用,要么编译器难实现,要么程序员难用;依我看,Concept三个毛病都占齐了。

Enable If

Boost中要多一个disable_if,其余直接用 std::enable_if 即可。

元编程数据结构与算法

MPL

C++11之前用于元编程的库。提供了一系列的类型的容器、算法 (find, count, sort 等)以及辅助函数。它在类型系统上,提供了类STL的库以像变量那样操作类型。

比如下面这个例子中,floats是一组类型的“vector”,可以通过push back加入新的类型,并使用at取出对应的类型并判断。

typedef 

在C++11之后,应使用Boost 1.66新加入的MP11。

MP11

C++11版的MPL。在C++11之后应该使用它,编译速度要快一些。

运行时泛化

Type Erasure

宏元编程

Preprocessor (PP)

MPL提供了一套模板的库运算,PP则提供了宏上的元编程库。它也提供了一些类似于容器的东西,比如List,Tuple等,容器中的元素就是标识符。

感受一下它的用法:

#include 

这东西看起来非常异端,不过它对代码展开会很有帮助 —— 比如可以用它来控制把for循环展开若干层深度;或者生成若干个变量的名字。

高级技能可以不学,不过 STRINGIZE,CONCAT,COMMA 要记住,以后总能用得上。

VMD

VMD是对PP的一个扩充,提供了对PP中数据和数据结构的操作。比如把PP中的List转换成PP中的Tuple;判断一个输入是不是一个PP的列表;给PP提供了push back, pop back等操作函数。要想用它,你得先用得到PP。

杂耍

Hana

这个库需要C++14及以上的支持。这个库骨骼比较惊奇,基本思路是把类型变成值,经过运算后,再把值变成类型。文档自己也说了,它是MPL和Fusion的混合体。如果你是想实现类似于ducking type这样的特性,那是Hana好用许多。

举个例子:

boost

文件格式

文本

PropertyTree

可以以树的结构来读写XML, JSON, INI和INFO文件。

图像

GIL

图像文件的读写库。这个库是Adobe贡献的。

这个库把图像的读写抽象成了Image View和Pixel Iterator/Allocator,这样可以灵活处理像素格式。本身只支持Jpeg,Tiff和Png格式,不过可以挂接其它扩展。

控制流

Context

自从有了Lambda之后,Boost心就野了,想支持现代语言普遍支持的并发机制Co-routine。Co-routine的基本思想就是让多个函数共享执行线程,而且可以主动打断自己的执行。对于C++来说,一个基本的实现方法就是到打断的时候,把整个栈(当然还有保存下来的寄存器状态)拷贝出去,然后跳转到其他要执行的函数上;然后要继续执行的时候,再把栈拷贝回来。

Context这个库,就是帮你做上下文保存和切换的事情(当然还有call/cc的实现)。

C++的栈和C相近,基本上直接就是机器和OS上直接支持的栈。所以很明显,这里的Context代码,应该每一代CPU,每个OS、甚至是每个编译器都要来一份的 —— 而且基本上还得用汇编。

然后Boost就真的这么干了。

0376da63ad70f73526712e29f9fa484f.png

如你们所见,从1.51开始,Boost正式加入了Context。

有了Context之后,更高层的库就容易实现多了(我不信)。

Coroutine

1.53 开始加入了Coroutine,这个对C++11不是强制要求的。

Coroutine2

1.55 加入了Coroutine2,并且 Coroutine 停止维护了。只要编译器支持C++11,就应该用后面这个库。

关于这个库其实就三板斧,push type,pull type,yield。但是这文档当年我看了大概快半天的时间,才画出了一个葫芦。这里有个例子:

https://theboostcpplibraries.com/boost.coroutine​theboostcpplibraries.com

Chapter 51. Boost.Coroutine

Chapter 51. Boost.Coroutine​theboostcpplibraries.com

Fiber

Fiber和Co-routine在概念上非常相近,API也比较类似。它们都有调用方主动将自己切换出去的过程;并且在Boost上,都是由Context库实现状态保存和切换的。

二者主要的区别在于,Fiber和线程类似是有调度器的,yield之后,控制权交由调度器处理接下来调用哪个fiber;而co-routine是没有调度器的。Co-routine A代码需要把自己yield到Co-routine B上,Co-routine B则可以在适当时候,主动切换回A,或者等执行结束返回A继续执行。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4024.pdf​www.open-std.org

Scope Exit

数据流

Iostreams

Iterator

Range

网络

Beast

Http协议的基础库,可以用于开发Http协议的客户端和服务器端。
Socket部分是用ASIO实现。

ASIO

容器与数据结构

单数据存储

Any

Variant

静态长度结构

Array

Multi-Array

类C++98 STL容器

Intrusive

Container

Pointer Container

Poly Collection

Tuple

Unordered

Fusion

Fusion类似于STL中的容器、迭代器和算法,只不过它可以工作在 Boost.Tuple和Fusion Map之上。看下面的例子:

// 一个 “vector”(实际上就是tuple),有两个元素一个int一个float

它提供了和 struct 和 std::tuple 相兼容的视图,同时还能做类似于joint和zip之类的操作。

非 C++98 STL的数据结构

Compressed Pair

Heap

ICL

Property Map

Bimap

Circular Buffer

Dynamic Bitset

Lockfree

Multi-Index

函数与高阶函数

C++14上没用的

Bind

Function

Function Types

Lambda

Local Function

Member Function

Functional

Functional Forward

上面这些库,一些是用来生成匿名函数的,比如bind,lambda和local function,这些用C++11的lambda就能搞定,但是C++11之前就得各种奇技淫巧;还有一些是用于保存不同来源的函数对象的,比如function,member function之类,这些基本上就是C++11的function搞定。最后一个Functional Forward,就是瘸腿版的C++11 perfect forward。

C++14上还有用的

Functional/Overloaded functions

这个东西用于把多个签名的函数打包到一个名字中。看例子就一目了然了:

boost

但是说老实话,函数重载到底要调用谁难道自己写的时候心理还没有点逼数吗。。。

Phoenix

平台、硬件、操作系统服务

系统配置

Config

Predef

Compatibility

时间

Chrono

Date Time

Timer

硬件特性

Align

Atomic

Compute

Endian

操作系统服务

System

Filesystem

DLL

Thread

Process

Interprocess

日志

Log

数学、数值与物理

基本数值

Math/Common Factor

Integer

Multiprecision

Numeric Conversion

Rational

QVM

Math / Octonion

Math / Quaternion

Interval

线性代数

uBlas

Odeint

函数求值

Math/Special Functions

几何

Geometry

Polygon

离散

CRC

Functional/Hash

Sort

标准库里面的sort是基于比较排序的,这个库搞了点trick比如基数排序什么的,和标准库中的sort比,它对整数、字符串和浮点都提供了更快的排序实现。

Graph

GraphParallel

随机、概率与统计

Random

Min-max

Accumulator

Statistical Distributions

单位换算

Units

Ratio

文本分析与处理

字符串与值的转换

Convert

Format

Lexical Cast

本地化

Locale

一般字符串处理算法

String Algo

正则

Xpressive

Regex

Boost中一共两套Regular Expression的实现,一个是Xpressive,一个是Regex。前者的特点是,有一套方言能够在编译期给整一个DFA出来(当然也能在运行时compile出来,不过这个就没特色了);而后者则只能在运行时整了。

下面是个整个编译期DFA的例子。

sregex 

这TM看着就是Spirit的文法啊。

按照上古时代的性能评测,Xpressive要快很多。

不过大部分情况下,Regex就够用了,而且这个库在C++11时代也成为了标准库的一部分,不需要用到Boost中的实现了。

文法分析

Spirit

特定语法分析器

Wave

这个库提供了C++中预处理器(Preprocessor)的实现。如果用户在开发一个新的语言编译器/解释器,并且想让这个语言拥有等同于C++11预处理器的功能(包括include,条件编译,宏替换),就可以直接使用这个库。

语法糖与语言扩展

语法糖

Assign

Foreach

Operators

Optional

Parameter

Ref

Swap

Tribool

方言

Metaparse

Proto

设计模式与习惯用法

教做人

Value Initialized

惯用法

Serialization

Signals(废弃)

Signals2

GoF设计模式

Flyweight

Functional/Factory

In-place factory

Mate State Machine

Statechart

Pool

调试、测试与诊断

Assert

Static Assert

Stacktrace

ThrowException

Test


Conversion

Core

Exception

IO State Savers

Move

Program Options

Python

Smart Ptr

Utility

Uuid

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值