【发布时间】:2020-09-09 08:42:46
【问题描述】:
我是 C++ 新手。我见过无数使用operator<< 的示例,其中输出发送到cout 或cerr。大多数类重载此运算符以在控制台中获得人类可读的输出,例如in this example:
ostream& operator<<(ostream& os, const Date& dt)
{
os << dt.mo << '/' << dt.da << '/' << dt.yr;
return os;
}
它允许这样做:
Date dt(5, 6, 92);
cout << "The date is " << dt;
现在,我想做同样的事情,但我想输出到文件,而不是控制台。我正在使用 Boost,我正在关注the example here:
logging::record rec = lg.open_record();
if (rec)
{
logging::record_ostream strm(rec);
strm << "Hello, World!";
strm.flush();
lg.push_record(boost::move(rec));
}
这个例子很好,但我想把这段代码放到一个函数中。到目前为止,这是我的代码:
namespace logging = boost::log;
void log(severity_level level, std::string message)
{
src::severity_logger<severity_level> lg;
logging::record rec = lg.open_record(keywords::severity = level);
if (rec)
{
logging::record_ostream strm(rec);
strm << message;
strm.flush();
lg.push_record(boost::move(rec));
}
}
当然这适用于string,但它不适用于上例中的Date:
Date dt(5, 6, 92);
log(severity_level::info, "The date is "); // No problem here
log(severity_level::info, dt); // Error, dt is not of type string
我该怎么做?
【问题讨论】:
-
" 它不适用于上面的
Date示例" - 为什么不呢?logging::record_ostream不是派生自std::ostream&吗?否则我看不出有什么明显的原因导致它不起作用 -
您标记了boost,所以我想
logging::record_ostream来自boost?您可能需要另一个重载来接受提升流。 -
@UnholySheep 因为我正在记录
message,我在最后一段代码中将其作为字符串参数传递。对不起,如果问题不清楚,我会编辑。 -
@Yksisarvinen 它是
namespace logging = boost::log;, as defined here in the docs;固定。
标签: c++ boost operator-keyword