1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
#include <sstream>
#include <string>
class LogMessage
{
public:
LogMessage( const char* msg ) : numberOfArgs_( 0 )
{
init( msg, 0, 0 );
}
template< typename T1 >
LogMessage( const char* msg, const T1& t1 )
: numberOfArgs_( 1 )
{
init( msg, t1, 0 );
}
template< typename T1, typename T2 >
LogMessage( const char* msg, const T1& t1, const T2& t2 )
: numberOfArgs_( 2 )
{
init( msg, t1, t2 );
}
std::string str() const
{
return buffer_.rdbuf()->str();
}
private:
std::ostringstream buffer_;
int numberOfArgs_;
int precision_;
template< typename T1, typename T2 >
void init( const char* msg, const T1& t1, const T2& t2 )
{
precision_ = 6;
for ( ; *msg; ++msg )
{
if (*msg != '%' )
buffer_.rdbuf()->sputc( *msg );
else
{
++msg;
if ( *msg == '%' ) buffer_.put( '%' );
else if ( *msg == '1' && numberOfArgs_ > 0 ) append( t1 );
else if ( *msg == '2' && numberOfArgs_ > 1 ) append( t2 );
}
}
}
template< typename T >
void append( const T& t ) { buffer_ << t; }
}; |