簡體   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