繁体   English   中英

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

[英]C++ use operator<< output as parameter in function

我是 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;
    // ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM