Boost logo

Boost Users :

From: Samuel Krempp (krempp_at_[hidden])
Date: 2005-03-07 07:38:06


le Wednesday 22 December 2004 17:25, dimerman_at_[hidden] écrivit :

> Foster, Gareth wrote:
>> Could you do Logger<DBG> MyLogger; MyLogger.print(); ?
>>
>
> It wont have the same effect, for if I parametrize the class itself, I
> will end up having as many actual instances as severity levels.
> Parametrizing the print function allows me to use the same logger (with
> its corresponding devices such as files, console, etc.) for different
> levels.
> Since the actual function to be called is resolved at compile time, I
> get to avoid costly constructions (mostly string concatenation and such)
> for debug purposes to be carried in the release version (assuming the
> compiler notices...).

what about you put the dbg-level dependant code in the formatter object,
like :

// a no-op formatter object :
// (formatting, and outputting, is a no-op at compile-time)

struct dummy_format {
template<class T>
dummy_format& operator%(const T& x) { return *this; }
}

inline ostream& operator<<(ostrem& os, dummy_format const& x) {
  return os;
}

// a level-based selecter :
template<int> struct DbgFormatType {
 typedef boost::format type;
}
template<> struct DbgFormat<0> {
        typedef dummy_format type;
}

// a level-dependant formatter :
template<int n> struct DbgFormat {
 typedef typename DbgFormatType<n>::type type;
        type fmter;

        DbgFormat(const char* s) : fmter(s) {}
        
        template<class T>
 type operator%(const T & x) const {
   return fmter % x;
 }
}

And in the code you'd do :
(assuming the function dest() returns an ostream. any other semantics
for output would work..)

myLogger.dest() << DbgFormat<level>(fmt_str) % x1 % x2 % "truc";

if you want to put all log-related stuff (destination AND formatting
policy) into a signle logger object, you could have :

template<int n> class MyLogger {
 ..
DbgFormat<n> fmter(const char* s) { return DbgFormat<n>(s); }
...
}

and then do :
myLogger.dest() << myLogger.fmter(fmt_str) % x1 % x2 % "truc";

Would that be fitting your needs ?

-- 
Samuel

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net