Какой буфер должен быть установлен при помощи basic_streambuf :: setbuf? - PullRequest
3 голосов
/ 16 ноября 2011

Я работаю над basic_streambuf для обработки чтения и записи из / в сокет Winsock.Как и basic_filebuf, я внутренне использую объект std::codecvt для преобразования байтов, считываемых из базового сокета, в тип char "socket Streambuf", а также для преобразования символов, записанных в сокет streambuf, в байты, которые можно записатьв основной сокет.Чтобы сделать это, я обнаружил, что мне нужно поддерживать буферы для функций чтения и записи streambuf. * ​​1004 *

Логическая проблема, с которой я сталкиваюсь, заключается в том, что реализация streambuf предназначена для использования дляи чтение и запись (конструктор std::iostream принимает один указатель на streambuf), но есть только одна переопределяемая функция-член, которую можно настроить для установки нижележащего буфера символов: setbuf.Если я хочу разрешить пользователям моего шаблона сокета streambuf устанавливать базовый буфер, должен ли setbuf установить буфер чтения или запись?Какой вариант имеет больше смысла?

Ответы [ 2 ]

2 голосов
/ 16 ноября 2011

std::iostream наследуется от std::istream и std::ostream, но оба те наследуются практически от std::ios, который содержит буфер. Поскольку оба они наследуют виртуально от std::ios, существует только одна std::ios база std::iostream и, как таковая, только один внутренний буфер.

Из C ++ 11 февраля 2011 г. Черновик:

§ 27.6.3

Шаблон класса basic_streambuf служит абстрактным базовым классом для получения различных потоковые буферы, каждый объект которых управляет двумя последовательностями символов:
- последовательность ввода символов;
- последовательность вывода символов.

§ 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> {
1 голос
/ 17 ноября 2011

Стандартные потоки имеют только два указанных поведения с setbuf. Первый состоит в том, что setbuf (0,0) может не иметь никакого эффекта, а второй - для basic_filebuf, где, если setbuf (0,0) вызывается перед любым IO, тогда IO не буферизуется. В противном случае результаты определяются реализацией. Просто сделайте то, что имеет смысл для вашей реализации, а затем задокументируйте это.

...