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
通常在 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