Re: Extend streams in C++
On Jan 13, 3:25 am, Ioannis Papadopoulos
<giannis.papadopou...@gmail.com> wrote:
I would like to extend the functionality of all streams in C++ so I
can do some fancy stuff like redirecting the streams on the fly.
I don't want to reimplement the whole stream support in C++ and I
would like to keep as much as possible that is already existing.
However, the only thing that my user would like to see is the
following
#include "myiostream.hpp"
int main() {
my::cout << "Hello World" << std::endl;
}
cout will redirect anything from files to sockets and this
redirection will be handled by a runtime system without used
intervention.
My first attempt was to extend ostream and istream and reimplement
some of the functions. But clearly it isn't what I'm looking for,
since I have also to reimplement all other functions such as endl().
I think the way to go is to reimplement basic_streambuf and filebuf.
Am I in the right direction or should I start from lower layers
(ios_base) ?
Definitely not. Iostream's are carefully designed and have very
good separation of concerns. Sourcing and sinking are done in
the streambuf, using the strategy pattern. All you have to do
is arrange for your custom streambuf to replace the one
std::cout is using, something like:
std::cout.rdbuf( &myCustomStreambuf ) ;
=46rom then on, all output to std::cout will be directed to
myCustomStreambuf, rather than to what it was before. (To avoid
any risk of undefined behavior, you should probably save the
original streambuf, and restore it before program termination.)
Whether this is a good idea or not is another question.
Generally, if a programmer outputs to std::cout, he has very
good reasons for doing so, and "redirecting" his output is doing
him a disfavor. Such a trick might be useful, however, if you
have to deal with poorly written legacy code, which uses
std::cout when it should have used an std::ostream& passed in to
it.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34