|
Boost : |
From: John Torjo (john.lists_at_[hidden])
Date: 2004-04-20 11:13:16
>It's needed copy contructor for temporaries:
>
>
>
Right on :D Thanks for pointing it out. I used it in a different manner
before, and there was no need for it.
>Second, gcc doesn't accept "log" for namespace name.
>
>
>
Got it. Here's the new version:
#include <iosfwd>
#include <sstream>
namespace boost { namespace logtl /* note: gcc does not allow 'log' as a
namespace */{
// allow finding the prototype for a log function
template<class char_type, class traits = ::std::char_traits<char_type>,
class aloc = ::std::allocator<char_type> >
struct log_func {
typedef void (*type)(const std::basic_string<char_type,traits,aloc> &);
};
// allow writing to a log
template<class char_type, class traits = ::std::char_traits<char_type>,
class aloc = ::std::allocator<char_type> >
struct basic_logstream {
private:
typedef typename log_func<char_type,traits,aloc>::type log_func_type;
typedef ::std::basic_ostringstream<char_type,traits,aloc>
ostring_stream_type;
typedef ::std::basic_ostream<char_type,traits> ostream_type;
public:
explicit basic_logstream( log_func_type func) : m_func(func) {}
basic_logstream( const basic_logstream & other) : m_func(other.m_func) {
m_buffer << other.m_buffer.str();
other.m_func = 0;
}
~basic_logstream() {
if ( m_func)
m_func( m_buffer.str() );
}
template< class T>
basic_logstream & operator<<( const T & val) {
m_buffer << val;
return *this;
}
typedef std::ostream & (*ostream_func)(std::ostream & );
basic_logstream & operator<<( ostream_func f) {
f( m_buffer);
return *this;
}
// in case the underlying stream is needed...
ostream_type & ostream() {
return m_buffer;
}
private:
ostring_stream_type m_buffer;
mutable log_func_type m_func;
};
typedef basic_logstream<char> logstream;
typedef basic_logstream<wchar_t> wlogstream;
}}
Best,
John
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk