你能帮助我解决以下问题吗?
我正在尝试使用可变参数模板和包扩展来编写记录器。问题是我知道运营商<<必须只接受两个参数 - 第二个参数然后变成一个完整的包,我不知道如何将'const Args& ...rest
'扩展为'const T& v, const Args& ...rest
'
任何大师都可以解释如何重写可变参数表达式来实现这个目标吗?最终游戏的代码如下:
log << "string" << 1 << 1.2
;
立刻打印在一起。
(请原谅cout,它仅用于示例目的。想法是收集oss_
中的所有参数,然后打印一次。)。
编译器当前抱怨,我理解这是运算符&lt;&lt;的问题。仅接受两个论点。
‘LogHandle& operator<<(LogHandle&, const T&, const Args& ...)’ must take exactly two argument
以下是代码:
#include <iostream>
#include <string>
#include <sstream>
class LogHandle {
public:
template<typename T>
friend LogHandle& operator<<(LogHandle& l, const T& v)
{
l.oss_ << v;
std::cout << "Value is: " << l.oss_.str().c_str();
l.oss_.str("");
l.oss_.clear();
return l;
}
template<typename T, typename... Args>
friend LogHandle& operator<<(LogHandle& l, const T& v, const Args&... rest)
{
l.oss_ << v << " ";
return l << (rest...);
}
std::ostringstream oss_;
};
int main(int, char**)
{
LogHandle log;
log << "String" << 1;
}