class NullType {}; template class TypeList { typedef H Head; typedef T Tail; }; #define TYPELIST_1(T1) TypeList #define TYPELIST_2(T1, T2) TypeList #define TYPELIST_3(T1, T2, T3) TypeList #define TYPELIST_4(T1, T2, T3, T4) TypeList #ifndef LOGGERHOLDER_HH #define LOGGERHOLDER_HH #include #include #include template class LoggerHolder { private: LoggerList loggers_; public: LoggerHolder( void ) {} ~LoggerHolder( void ) {} template LoggerHolder& operator<<( const U& message ) { std::ostringstream oss; oss << message; for ( LoggerList::iterator it=loggers_.begin(); it!=loggers_.end(); ++it ) { (**it).write( oss.str() ); } return *this; } }; #endif // LOGGERHOLDER_HH template struct LoggerList : public std::list {}; template <> struct LoggerList : public std::list{}; template struct LoggerList < TypeList > : public std::list { typedef TypeList List_t; typedef typename H Head_t; typedef typename T Tail_t; LoggerList() { push_back( new Head_t ); LoggerList tmp; merge( tmp ); } ~LoggerList() { LoggerList::iterator it; for ( it=begin(); it!=end(); ++it ) delete *it; } }; #ifdef NLOG # define LOG(msg) #else # define LOG(msg) (*LoggerHolder::getInstance()) << msg; #endif