Re: inheriting from ostream to customize standard output
Am 30.03.2011 03:51, schrieb aaragon:
Hi everybody,
I was wondering if there is an easy way that one could create a custom
class that inherits from std::ostream to override the functionality of
operator<<.
Since I work with several processes, I want to avoid some of them to
print information to standard output (or enable that to print
information concurrently). I tried the following but it didn't work:
class Output_strem : public std::ostream {
typedef std::ostream base_type;
public:
Output_strem() : base_type() {}
template<typename T>
std::ostream& operator<<(T t) {
#ifdef MPI
std::ostream& os = *this;
os<<"["<<Parallel_base::rank_<<"] ";
#endif
return *this;
}
};
As you see, nothing is telling the ostream object to print to standard
output. I saw the definition of the cout in the standard library and
it looks like this:
ios_base::Init::Init()
{
if (__gnu_cxx::__exchange_and_add_dispatch(&_S_refcount, 1) == 0)
{
// Standard streams default to synced with "C" operations.
_S_synced_with_stdio = true;
new (&buf_cout_sync) stdio_sync_filebuf<char>(stdout);
// other created objects
// The standard streams are constructed once only and never
// destroyed.
new (&cout) ostream(&buf_cout_sync);
// other created objects
// NB: Have to set refcount above one, so that standard
// streams are not re-initialized with uses of ios_base::Init
// besides<iostream> static object, ie just using<ios> with
// ios_base::Init objects.
__gnu_cxx::__atomic_add_dispatch(&_S_refcount, 1);
}
}
Can someone point me in the right direction?
I'm not sure because I do not understand what you want to realize. Even
without grasping what you intend to do your initial approach looks
wrong, because
a) std::ostream does have non-virtual operator<< overloads, some as
members, some as free functions.
b) User-defined classes typically define their own operator<< overloads
accepting either std::ostream or - as function templates - such
overloads accepting basic_ostream<> as first parameter.
This clearly demonstrates that inheriting from std::ostream and
providing some generic operator<< overload cannot solve the problem to
hijack user-defined implementations that are IO inserters.
The main question is: What do you want to realize?
I guess you need to implement your own std::streambuf that you inject
into some ostream. If this is correct, you might want to look into
http://stackoverflow.com/questions/524524/creating-an-ostream
or google by combining 'adapter' with either 'ostream' or 'streambuf'.
HTH & Greetings from Bremen,
Daniel Kr?gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]