通常用于重载运算符<<对于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;。
实现类似的功能答案 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