Как перехватить все записи в подкласс std :: stringbuf? - PullRequest
0 голосов
/ 06 марта 2019

Мой вариант использования: я хочу, чтобы эти классы

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, где мне нужно добавить эту логику, чтобы перехватывать все случаи?

...