Мне нужно руководство или указатели, которые понимают, как реализовать пользовательский поток. Мои требования:
- Класс с '< < оператора для нескольких типов данных.
- Цель состоит в отправке вывода в базу данных. Каждая "строка" должна перейти к отдельной записи.
- В каждой записи наиболее важным полем будет текст (или blob), но некоторые другие поля, такие как время и т.д., могут быть в основном выведены автоматически. Буферизация
- важна, поскольку я не хочу обращаться к базе данных для каждой записи.
Во-первых, стоит ли это извлекать из ostream? Что я получаю от вывода из потока? Что делать, если мой класс просто реализует несколько методов operator<<
(включая некоторые пользовательские типы данных). Какую функциональность я получаю из потока?
Предполагая, что я хочу, это класс, полученный из ostream, мне нужно некоторое руководство, понимающее взаимосвязь между классами ostream и streambuf. Какой из них мне нужно реализовать? Если посмотреть на некоторые образцы, кажется, что мне вообще не нужно выводить из ostream, а просто дать конструктору ostream собственный streambuf. Это правда? что канонический подход?
Какие виртуальные функции в пользовательском streambuf мне нужно реализовать? Я видел несколько примеров (включая этот сайт: здесь и здесь и еще несколько), некоторые переопределяют метод sync
и другие переопределяют метод overflow
. Какой я должен переопределить? Кроме того, глядя на источники stringbuf и filebuf (Visual Studio или GCC), оба эти класса буферов реализуют множество методов streambuf.
Если требуется собственный класс, созданный из streambuf, будет ли какая-либо выгода, получаемая из stringbuf (или любого другого класса), а не непосредственно из streambuf?
Что касается "строк". Я бы хотел, по крайней мере, когда мои пользователи класса с использованием манипулятора 'endl' стали новой строкой (т.е. Записью в базе данных). Может быть - зависит от усилий - каждый символ \n 'следует рассматривать как новую запись. Кто из моих пользовательских ostream и/или streambuf получает уведомление для каждого?