C++ 运算符<<作为参数
c++ operator<< as parameter
通常用于重载操作符<<对于c++中的类,我会这样做:
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一起使用,也许这个框架提供了一些更多的功能?
编辑:我正在制作一个日志记录器框架。我需要一个功能,允许一个人添加一个日志行,这是描述与它的日志杠杆(调试,信息,错误等。它是一个枚举)和一个"流",可以用操作符<<或者像printf中的va_args
例如,print
调用看起来像这样:
print(MLL::ERROR, "Some text to format %u %i %f", 1, -1, 3.14f);
如您所见,我可以将日志级别参数传递给该函数。我想知道如何才能实现类似的功能与操作符<<
不确定这是否正是您想要做的,但是为什么不只是有一个包含对适当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之外,还可以将其克隆到日志文件中,类似于
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 左角支架解释为操作员&lt;而不是模板参数
- 重载运算符<<:此运算符函数的参数太多
- 重载<<运算符错误C2804:二进制'运算符<<'参数太多