enum trace_channels_e
{
  D_COMMON = 0,
  D_ME,
  NUM_TRACE_CHANNELS
};

class simple_tracer
{
private:
  vector<ostream*> _out {vector<ostream*>(NUM_TRACE_CHANNELS, &cout)};
  vector<bool> _ch_enables{vector<bool>(NUM_TRACE_CHANNELS, true)};
  char _buf[256];

  simple_tracer(){}
  simple_tracer(const simple_tracer& ) = delete;
  static simple_tracer& get() { static simple_tracer inst; return inst; }
public:
  static void trace(trace_channels_e channel, const char* format, ...)
  {
    if(get()._out[channel] && get()._ch_enables[channel])
    {
      va_list args;
      va_start(args, format);
      vsnprintf(get()._buf, 255, format, args);
      va_end(args);
      *(get()._out) << get()._buf;
    }
  }
  static void disable_channel(trace_channels_e channel) { get()._ch_enables[channel] = false; }
  static void enable_channel(trace_channels_e channel) { get()._ch_enables[channel] = true; }
  static void set_ostream(trace_channels_e channel, ostream& os) { get()._out[channel] = &os; }
};

#if ENABLE_TRACING
#define DTRACE(channel, ...) simple_tracer::trace(channel, __VA_ARGS__)
#else
#define DTRACE(...)
#endif


내가 직접 이렇게 만들어서 쓰려니 은근히 불편하네