C++ 使用运算符<<输出作为函数中的参数



我是c++的新手。我已经看到了大量使用operator<<的例子,其中输出被发送到coutcerr。大多数类都会重载这个操作符,以便在控制台中有一个可读的输出,例如本例中的

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,下面的例子是:

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

我怎么能做那样的事?

要支持多种类型,请将log()作为模板函数。原始代码的问题在于,您只重载了operator<<,并且没有重载任何转换运算符。

template<typename T>
void log(severity_level level, const T& message)
{
// ...
strm << message;
// ...
}

相关内容

  • 没有找到相关文章

最新更新