c ++运算符<<作为参数

时间:2016-10-27 16:43:37

标签: c++ qt operator-overloading operator-keyword

通常用于重载运算符<<对于c ++中的类,我会做类似的事情:

template <typename T>
void operator<< (const T &t)
{
    ostringstream stream;
    stream << t;
    // more code
}
然而,我想知道是否有可能使运营商&lt;&lt;成为参数之一。可以使用va_list创建一个方法,以格式化字符串并传递其他参数,例如:

void CBcLogger::print(MLL::ELogLevel lvl, const char* text, ...)

正如您在上面的方法中看到的,我可以传递要格式化的文本以及lvl参数。如果我想使用operator<<,我是否能够以某种方式压缩更多参数而不仅仅是操作符?像

这样的东西
void multiParamFunc(const unsigned int logLevel, "operator<< here")

我知道这不是正确的语法,但我只是想说明一点。

对于这个案子,我将非常感谢。 另外,我对纯c ++问这个问题,但最后我会将它用于QT。也许这个框架提供了更多功能?

编辑:我正在制作一个记录器框架。我需要一个允许添加日志行的函数,该日志行使用其日志栏(调试,信息,错误等,它是一个枚举)和一个&#34;流&#34;来描述。可以用运算符&lt;&lt;&lt;&lt;或者像printf中的va_args。

例如,print调用如下所示:

print(MLL::ERROR, "Some text to format %u %i %f", 1, -1, 3.14f);

如您所见,我可以将日志级别参数传递给此函数。我想知道如何使用运算符&lt;&lt;。

实现类似的功能

1 个答案:

答案 0 :(得分:1)

不确定这究竟是你想要做的,但为什么不只是有一个包含对相应ostream的引用的简单类?

class Message : public std::ostream{
  enum LogLevel { DEBUG, INFO, WARNING, ERROR };
  std::ostream* os;
public:
  static LogLevel threshold = DEBUG;
  Message(LogLevel level) : os(0){
    if(level > threshold){
      os = level > INFO ? &std::cerr : &std::cout;
    }
  }

  template<class T> std::ostream& operator<< (const T& t){ 
    return os ? (*os)<<t : this;
  }
};

Message(Message::DEBUG)<<"This won't be printed.\n";
Message(Message::INFO) <<"This will go to stdout.\n";
Message(Message::ERROR)<<"This will go to stderr.\n";

我不认为这会按照书面形式运作,但会给出基本的想法。为了更高级一点,你可以让Message类拥有一个ostringstream,然后除了cout / cerr之外你还可以克隆到日志文件,类似于this