C ++使用operator <<输出作为函数中的参数

问题描述

我是C语言的新手。我已经看到了使用operator<<的无数示例,其中将输出发送到coutcerr。大多数类都会重载此运算符,使其在控制台中具有易于阅读的输出,例如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,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<<,而没有重载任何conversion operators

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