c++ operator<< 作为参数

c++ operator<< as parameter

通常在 C++ 中为 class 重载 operator<< 我会做类似的事情:

template <typename T>
void operator<< (const T &t)
{
    ostringstream stream;
    stream << t;
    // more code
}

我想知道是否可以使运算符<<成为参数之一。可以使用 va_list 创建一个方法来格式化字符串并传递其他参数,例如:

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

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

void multiParamFunc(const unsigned int logLevel, "operator<< here")

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

对于此案的所有帮助,我将不胜感激。 另外,我问这个是关于纯 c++ 的,但最后我会把它和 QT 一起使用。也许这个框架提供了更多的功能?

编辑:我正在制作一个记录器框架。我需要一个允许添加日志行的函数,该日志行用其日志杠杆(调试、信息、错误等。它是一个枚举)和可以用 operator<< 或 [ 格式化的 "stream" 进行描述=35=] 就像在 printf.

例如,print 调用如下所示:

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

如您所见,我可以将日志级别参数传递给此函数。我想知道如何使用 operator<<.

实现类似的功能

不确定这是否正是您想要做的,但为什么不直接使用包含对适当 ostream 的引用的简单 class 呢?

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";

我认为这不会像写的那样起作用,但给出了基本的想法。要更高级一点,您可以让消息 class 拥有一个 ostringstream,然后除了 cout/cerr 之外您还可以将其克隆到日志文件,类似于 this