2010-04-25 4 views
4

Je voudrais écrire un ostream simple qui enveloppe un argument ostream et modifie le flux d'une certaine façon avant de le transmettre au flux d'arguments. La transformation est quelque chose de simple comme changer une lettre ou effacer un motÉcriture d'un filtre ostream?

De quoi aurait l'air une simple classe héritant de ostream? Quelles méthodes devrais-je remplacer?

Répondre

2

std::ostream n'est pas le meilleur endroit pour implémenter le filtrage. Il n'a pas les fonctions virtuelles appropriées pour vous permettre de le faire.

Vous voulez probablement écrire une classe dérivée de std::streambuf contenant un enveloppé std::ostream (ou enveloppé std::streambuf), puis créer un std::ostream en utilisant ce std::streambuf.

std::streambuf possède une fonction virtuelle overflow que vous pouvez remplacer et utiliser pour modifier les octets avant de les transmettre à la classe de sortie encapsulée.

0

J'ai toujours pensé que l'écriture de flux spécialisés est la mauvaise approche de presque tous les problèmes. Le flux de sortie est généralement un point de terminaison dans votre programme - tout traitement de données doit être effectué longtemps avant que vous arriviez au flux lui-même. De même pour les flux d'entrée - mettre l'intelligence nécessaire pour (par exemple) analyser l'entrée dans le flux la place au mauvais endroit. Juste mes 2 cents, bien sûr.

+0

Certainement. C'est peut-être un endroit judicieux pour brancher des filtres d'octets tels que la compression ou le cryptage (ajoutez ces sortes d'entités de manière transparente au code qui est déjà sérialisé en ostream), mais ce n'est probablement pas le bon endroit pour manipuler des données structurées. –