[/
    Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)

    Distributed under the Boost Software License, Version 1.0. (See accompanying
    file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

    Official repository: https://github.com/boostorg/beast
]



[section:stream_types 流类型]

__Stream__ 是一种通信通道，数据以有序字节序列的形式在其中可靠传输。流可分为同步流与异步流，可支持读操作、写操作或两者同时支持。需要注意的是，某个具体类型可能同时符合多个概念模型。例如，网络库中的 __socket__ 与 __ssl_stream__ 类型同时支持 __SyncStream__ 与 __AsyncStream__ 两种概念。Beast 中的所有流算法均以模板函数形式声明，并使用这些概念进行约束：

[table 流概念
[[概念][描述]]
[
    [__SyncReadStream__]
    [用于支持面向缓冲区的阻塞读取操作。]
][
    [__SyncWriteStream__]
    [用于支持面向缓冲区的阻塞写入操作。]
][
    [__SyncStream__]
    [一种流类型，用于支持面向缓冲区的阻塞读写操作。]
][
    [__AsyncReadStream__]
    [用于支持面向缓冲区的异步读取操作。]
][
    [__AsyncWriteStream__]
    [用于支持面向缓冲区的异步写入操作。]
][
    [__AsyncStream__]
    [一种流类型，用于支持面向缓冲区的异步读写操作。]
]
]

这些模板元函数用于检查某个类型是否满足各类流概念的要求，并提供一些额外的实用工具。该库内部使用这些类型检查，同时也将其作为公共接口开放，方便用户用同样的方式增强自己的代码。采用这些类型检查机制，有助于在编译时给出更清晰的错误提示。

[table 类型特征与元函数
[[名称][描述]]
[[
    [link beast.ref.boost__beast__executor_type `executor_type`]
][用于表示 `get_executor` 返回的对象类型的别名。
]]
[[
    [link beast.ref.boost__beast__has_get_executor `has_get_executor`]
][用于判断是否存在 `get_executor` 成员函数。
]]
[[
    [link beast.ref.boost__beast__is_async_read_stream `is_async_read_stream`]
][用于判断某个类型是否符合 __AsyncReadStream__ 概念的要求。
]]
[[
    [link beast.ref.boost__beast__is_async_stream `is_async_stream`]
][用于判断某个类型是否同时符合 __AsyncReadStream__ 与 __AsyncWriteStream__ 概念的要求。
]]
[[
    [link beast.ref.boost__beast__is_async_write_stream `is_async_write_stream`]
][用于判断某个类型是否符合 __AsyncWriteStream__ 概念的要求。
]]
[[
    [link beast.ref.boost__beast__is_sync_read_stream `is_sync_read_stream`]
][用于判断某个类型是否符合 __SyncReadStream__ 概念的要求。
]]
[[
    [link beast.ref.boost__beast__is_sync_stream `is_sync_stream`]
][用于判断某个类型是否同时符合 __SyncReadStream__ 与 __SyncWriteStream__ 概念的要求。
]]
[[
    [link beast.ref.boost__beast__is_sync_write_stream `is_sync_write_stream`]
][用于判断某个类型是否符合 __SyncWriteStream__ 概念的要求。
]]
]

在函数或类模板类型上使用 `static_assert` 配合这些类型检查，可以给用户提供更清晰的错误信息，同时避免未定义行为。以下示例展示一个用于向同步流写入数据的模板函数，该示例演示如何对其参数类型进行检查：

[snippet_core_3]

[endsect]
