# C++ 标准库扩展

< cpp‎ | experimental

C++ 库基础扩展之版本 1 (The C++ Extensions for Library Fundamentals) ， ISO/IEC TS 19568:2015 为 C++ 标准库定义下列新组件：

C++17 未选择 ISO/IEC TS 19568:2015 的下列组件

#### 支持类型擦除分配器的既存类修改版本

定义于头文件 `<experimental/functional>`
function | 带有类型擦除分配器支持的 std::function 修改版本 (类模板)
定义于头文件 `<experimental/future>`
promise | 带有类型擦除分配器支持的 std::promise 修改版本 (类模板)
packaged_task | 带有类型擦除分配器支持的 std::packaged_task 修改版本 (类模板)

#### 内存资源适配器

resource_adaptor | 将分配器适配到 memory_resource (别名模板)

### 通用工具

定义于头文件 `<experimental/utility>`
erased_type | 类型擦除的占位符类型，例如在分配器中 (类)
定义于头文件 `<experimental/type_traits>`
invocation_type raw_invocation_type | 推导以给定参数调用可调用对象时的隐含函数类型 (类模板)

### 特性测试宏

定义于头文件 `<experimental/optional>`
__cpp_lib_experimental_optional | 至少为 201411 的值，指示支持 optional 类型 (宏常量)
定义于头文件 `<experimental/any>`
__cpp_lib_experimental_any | 至少为 201411 的值，指示支持 any 类型 (宏常量)
定义于头文件 `<experimental/string_view>`
__cpp_lib_experimental_string_view | 至少为 201411 的值，指示支持 basic_string_view 模板 (宏常量)
定义于头文件 `<experimental/tuple>`
__cpp_lib_experimental_apply | 至少为 201402 的值，指示支持 tuple 的 apply() 函数 (宏常量)
定义于头文件 `<experimental/type_traits>`
__cpp_lib_experimental_type_trait_variable_templates | 至少为 201402 的值，指示支持类型特性的变量模板 (宏常量)
__cpp_lib_experimental_invocation_type | 至少为 201406 的值，指示支持调用类型特性 (宏常量)
定义于头文件 `<experimental/functional>`
__cpp_lib_experimental_boyer_moore_searching | 至少为 201411 的值，指示支持附加搜索算法 (宏常量)
__cpp_lib_experimental_function_erased_allocator | 至少为 201406 的值，指示支持 std::function 的类型擦除分配器 (宏常量)
定义于头文件 `<experimental/future>`
__cpp_lib_experimental_promise_erased_allocator | 至少为 201406 的值，指示支持 std::promise 的类型擦除分配器 (宏常量)
__cpp_lib_experimental_packaged_task_erased_allocator | 至少为 201406 的值，指示支持 std::packaged_task 的类型擦除分配器 (宏常量)
定义于头文件 `<experimental/memory>`
__cpp_lib_experimental_shared_ptr_arrays | 至少为 201406 的值，指示 shared_ptr 支持数组 (宏常量)
定义于头文件 `<experimental/memory_resource>`
__cpp_lib_experimental_memory_resources | 至少为 201402 的值，指示支持多态内存资源 (宏常量)
定义于头文件 `<experimental/algorithm>`
__cpp_lib_experimental_sample | 至少为 201402 的值，指示支持采样算法 (宏常量)

## 并入 C++17

ISO/IEC TS 19568:2015 的下列组件已包含于 C++17

### 可选对象

定义于头文件 `<experimental/optional>`
optional | 表示可选对象的类模板 (类模板)

### 类 `any`

定义于头文件 `<experimental/any>`
any | 任何类型单个值的类型安全容器 (类)

### `string_view`

定义于头文件 `<experimental/string_view>`
basic_string_view | 到字符串的非占有引用 (类模板)

### 类型擦除及多态分配器

#### 多态分配器与内存资源

此节中的实体声明于 std::experimental::pmr 命名空间

定义于头文件 `<experimental/memory_resource>`
memory_resource | 封装内存资源的类的抽象接口 (类)
synchronized_pool_resource | 线程安全的，在不同块大小的池中管理分配的 memory_resource (类)
unsynchronized_pool_resource | 线程不安全的，在不同块大小的池中管理分配的 memory_resource (类)
monotonic_buffer_resource | 特殊用途的 memory_resource ，它仅在销毁资源时释放分配的内存 (类)
polymorphic_allocator | 支持运行时多态的分配器，多态基于构造所用的 memory_resource (类模板)
new_delete_resource | 返回一个静态的程序范围 `memory_resource`，它使用全局 operator new 与 operator delete 分配和解分配内存 (函数)
null_memory_resource | 返回一个不进行任何分配的静态 `memory_resource` (函数)
get_default_resource | 获取缺省 `memory_resource` (函数)
set_default_resource | 设置缺省 `memory_resource` (函数)

#### 使用多态分配器的容器的便利别名

`std::experimental::pmr` 命名空间中为标准库中的下列类模板提供便利别名和别名模板：

提供了便利别名的容器模板列表
std::vector std::deque std::forward_list std::list std::basic_string std::map std::multimap std::set std::multiset std::match_results std::unordered_map std::unordered_multimap std::unordered_set std::unordered_multiset

### `shared_ptr` 的数组支持

定义于头文件 `<experimental/memory>`
类 | 描述
shared_ptr | 支持数组的 std::shared_ptr 修改版本 (类模板)
weak_ptr | 支持数组的 std::weak_ptr 修改版本 (类模板)

### 采样和搜索算法

定义于头文件 `<experimental/algorithm>`
sample | 从序列中选择 n 个随机元素 (函数模板)
search | 应用搜索器 (Searcher) 到序列 (函数模板)
定义于头文件 `<experimental/functional>`
default_searcher | 标准 C++ 库搜索算法实现 (类模板)
make_default_searcher | 创建 default_searcher 的帮助函数 (函数模板)
boyer_moore_searcher | Boyer-Moore 搜索算法实现 (类模板)
make_boyer_moore_searcher | 创建 boyer_moore_searcher 的帮助函数 (函数模板)
boyer_moore_horspool_searcher | Boyer-Moore-Horspool 搜索算法实现 (类模板)
make_boyer_moore_horspool_searcher | 创建 boyer_moore_horspool_searcher 的帮助函数 (函数模板)

### 通用工具

定义于头文件 `<experimental/tuple>`
apply | 以参数的 tuple 调用函数 (函数模板)

另外，该 TS 为标准库中的类型特性和其他类模板提供大量 `constexpr` 变量模板：

提供了变量模板的类型特性和其他类模板
std::is_void std::is_null_pointer std::is_integral std::is_floating_point std::is_array std::is_pointer std::is_lvalue_reference std::is_rvalue_reference std::is_member_object_pointer std::is_member_function_pointer std::is_enum std::is_union std::is_class std::is_function std::is_reference std::is_arithmetic std::is_fundamental std::is_object std::is_scalar std::is_compound std::is_member_pointer std::is_const std::is_volatile std::is_trivial std::is_trivially_copyable std::is_standard_layout std::is_pod std::is_literal_type std::is_empty std::is_polymorphic std::is_abstract std::is_final std::is_signed std::is_unsigned std::is_constructible std::is_trivially_constructible std::is_nothrow_constructible std::is_default_constructible std::is_trivially_default_constructible std::is_nothrow_default_constructible std::is_copy_constructible std::is_trivially_copy_constructible std::is_nothrow_copy_constructible std::is_move_constructible std::is_trivially_move_constructible std::is_nothrow_move_constructible std::is_assignable std::is_trivially_assignable std::is_nothrow_assignable std::is_copy_assignable std::is_trivially_copy_assignable std::is_nothrow_copy_assignable std::is_move_assignable std::is_trivially_move_assignable std::is_nothrow_move_assignable std::is_destructible std::is_trivially_destructible std::is_nothrow_destructible std::has_virtual_destructor std::alignment_of std::rank std::extent std::is_same std::is_base_of std::is_convertible std::ratio_equal std::ratio_not_equal std::ratio_less std::ratio_less_equal std::ratio_greater std::ratio_greater_equal std::tuple_size std::chrono::treat_as_floating_point std::is_error_code_enum std::is_error_condition_enum std::is_bind_expression std::is_placeholder std::uses_allocator