Реализация прокси-объекта, который предоставляет вам оператор << и передает маркер владения возвращенному прокси-объекту. Когда объект с маркером владения умирает, вы очищаете поток. </p>
Простой способ сделать это - заключить ostringstream в auto_ptr в вашем прокси и сбросить в журнал, когда auto_ptr не равен нулю в d-tor прокси.
Это даст вам возможность форматирования с помощью ostream, но все равно приведет только к одному вызову вашего логгера, который, как я думал, был настоящей проблемой.
Подумайте о чем-то вроде этого:
class CLoggingProxy
{
public:
template <class T>
CLoggingProxy operator<<( const T& rhs )
{
if ( stream )
*stream << rhs;
return *this;
}
~CLoggingProxy()
{
if ( stream )
logger->log(stream->str());
}
private:
std::auto_ptr<std::ostringstream> stream;
CLogger* logger;
friend class CLogger;
CLoggingProxy( CLogger* logger ) // call this e.g. from the logger to "start" input
: stream(new std::ostringstream), logger(logger) {}
};