Ho bisogno di alcuni consigli o indicazioni su come implementare un ostream personalizzato. I miei requisiti sono:Un ostream personalizzato
- Una classe con un operatore '< <' per i tipi di dati diversi.
- L'intenzione è quella di inviare l'output al database. Ogni "linea" dovrebbe andare a un record separato.
- Ogni campo più importante sarebbe il testo (o blob), ma altri campi come il tempo ecc. Possono essere dedotti automaticamente automaticamente
- il buffering è importante, poiché non voglio andare al database per ogni record.
In primo luogo, vale la pena derivare da ostream? Cosa ottengo derivando da ostream? Cosa succede se la mia classe implementa semplicemente alcuni metodi operator<<
(inclusi alcuni tipi di dati personalizzati). Quale funzionalità ottengo da ostream?
Supponendo che quello che voglio sia una classe derivata da ostream, ho bisogno di una guida per capire la relazione tra le classi ostream e streambuf. Quale devo implementare? Guardando alcuni esempi, sembra che non sia necessario derivare da ostream e dare al costruttore ostream uno streambuf personalizzato. È vero? è questo l'approccio canonico?
Quali funzioni virtuali dello streambuf personalizzato devo implementare? Ho visto alcuni esempi (incluso questo sito: here e here e alcuni altri), alcuni annullano il metodo sync
e altri sovrascrivono il metodo overflow
. Quale dovrei scavalcare? Inoltre, osservando le sorgenti stringbuf e filebuf (Visual Studio o GCC) entrambe le classi buffer implementano molti metodi dello streambuf.
Se è richiesta una classe personalizzata derivata da streambuf, ci sarebbe qualche vantaggio derivante da stringbuf (o qualsiasi altra classe) invece che direttamente da streambuf?
Come per "linee". Vorrei almeno quando i miei utenti della classe usano il manipolatore 'endl' per essere una nuova linea (cioè registrare nel database). Forse - dipende dallo sforzo - ogni carattere "\ n" dovrebbe essere considerato come un nuovo record. Chi sono i miei ostream personalizzati e/o streambuf per ricevere una notifica per ciascuno?
Probabilmente dovresti creare la tua classe 'streambuf', che gestisce tutto il lavoro pesante, e quindi creare una classe' ostream' molto semplice che eredita 'std :: basic_ostream' e inizializza con il tuo oggetto' streambuf'. –
Dovresti dare un'occhiata a [Boost.Iostreams] (http://www.boost.org/doc/libs/release/libs/iostreams/doc/index.html) - la creazione di stream e buffer personalizzati è molto più semplice. –
Grazie per la tua modifica, @MarkusParker – Uri