我正在开发一个 basic_streambuf
来处理从/到 Winsock 套接字的读取和写入。就像 basic_filebuf
一样,我在内部使用 std::codecvt
对象将从底层套接字读取的字节转换为“socket streambuf”的 char 类型,以及将写入套接字 streambuf 的字符转换为可以写入底层套接字的字节。为此,我发现我需要为 streambuf 的读取和写入功能维护缓冲区。
我遇到的逻辑问题是,streambuf 实现旨在用于读取和写入(std::iostream
constructor 采用单个指向 streambuf 的指针),但只有一个可重写的成员函数可以为设置底层字符缓冲区而定制:setbuf
.如果我想让我的套接字流缓冲区模板的用户设置底层缓冲区,setbuf
应该设置读取缓冲区还是写入缓冲区?哪个选项更有意义?
最佳答案
std::iostream
继承自 std::istream
和 std::ostream
, 但那些实际上都继承自 std::ios
,其中包含缓冲区。因为它们实际上都继承自 std::ios
, 只有一个 std::ios
std::iostream
基地,因此只有一个内部缓冲区。
摘自 C++2011 年 2 月 11 日草案:
§ 27.6.3
The class template basic_streambuf serves as an abstract base class for deriving various stream buffers whose objects each control two character sequences:
— a character input sequence;
— a character output sequence.
§ 27.7.2
namespace std {
template <class charT, class traits = char_traits<charT> >
class basic_istream : virtual public basic_ios<charT,traits> {
§ 27.7.3
namespace std {
template <class charT, class traits = char_traits<charT> >
class basic_ostream : virtual public basic_ios<charT,traits> {
关于c++ - basic_streambuf::setbuf 应该设置哪个缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8144347/