Мой вариант использования: я хочу, чтобы эти классы
class MyBuffer : public std::stringbuf {...}
class MyStream : public std::ostream {...}
MyStream
будут владеть MyBuffer
и использовать его для хранения кусков материала, который впоследствии будет перенаправлен в другое место.Насколько я могу судить, оператор вставки в MyStream
правильно помещает данные в m_my_buffer
.
MyStream::MyStream () : std::ostream (& m_my_buffer) {...}
Основываясь на рекомендациях, которые я не совсем понимаю (но, похоже, это работает),эта виртуальная функция перегружена
int MyBuffer::sync ()
{
// write str() to some other location then call str("") to reset
return 0;
}
Пока все хорошо.
Теперь я хочу предотвратить запись данных в MyStream::m_my_buffer
на основании каких-либо условий.Я предполагал, что в конечном итоге на stringbuf
будет один или два виртуальных метода, которые на самом деле записывают данные, и, переопределив их, я могу добавить свое условие в момент ввода данных.
Вот что я нашел:
streambuf::sputc
Внутренне, функция вызывает виртуальный защищенный элемент overflow
, если для указателя вставки нет доступных позиций записи (pptr
). В противном случае функция использует указатель ввода (pptr
) напрямую, без вызова виртуальных функций-членов. (выделение добавлено)
streambuf::sputn
Вызывает защищенный виртуальный член xsputn
streambuf::xsputn
Записывает символы из массива, на который указывает s, в контролируемую последовательность вывода,пока не будет написано n символов или не будет достигнут конец последовательности вывода.
Это не похоже на унифицированный интерфейс.Если я хочу добавить эту логику:
void MyBuffer::write_some_data (args...) override
{
if (condition ())
return;
else
std::stringbuf::write_some_data (args...);
}
, что такое / являются функциями write_some_data
в интерфейсе stringbuf
, где мне нужно добавить эту логику, чтобы перехватывать все случаи?