all, thanks for sharing the code, I just do a test, then Neil's method will still do the string formating, for example:
#include <streambuf> #include <ostream> #include <iostream> using namespace std; template <class cT, class traits = std::char_traits<cT> > class basic_nullbuf: public std::basic_streambuf<cT, traits> { typename traits::int_type overflow(typename traits::int_type c) { return traits::not_eof(c); // indicate success } }; template <class cT, class traits = std::char_traits<cT> > class basic_onullstream: public std::basic_ostream<cT, traits> { public: basic_onullstream(): std::basic_ios<cT, traits>(&m_sbuf), std::basic_ostream<cT, traits>(&m_sbuf) { init(&m_sbuf); } private: basic_nullbuf<cT, traits> m_sbuf; }; typedef basic_onullstream<char> onullstream; typedef basic_onullstream<wchar_t> wonullstream; class MyClass { int a; friend ostream& operator<< (ostream&, MyClass const&); }; ostream& operator<<(ostream& out,MyClass const& b) { std::cout<<"call format function!!"; out << b.a; return out; } int main() { onullstream os; MyClass obj; os<<obj; }
Running this program, you will find that "ostream& operator<<(ostream& out,MyClass const& b)" will be called. So, doing format on the obj will still be called. So, we still can't avoid the overhead of formatting messages.