如何仅在表达式中使用ostringstream

时间:2018-08-17 16:38:57

标签: c++ ostringstream

我使用std::ostringstream格式化字符串,该字符串从<<继承了其ostream运算符,因此它们返回ostream而不是ostringstream,表示我无法在结果上致电ostringstream::str。通常这不是问题,因为我通常可以这样做:

ostringstream stream;
stream << whatever;
string str = stream.str();

但是有时候我需要*仅在单个表达式中使用它,这更加困难。我能做

string str = ((ostringstream&) (ostringstream() << whatever)).str();

但是,如果<<重载返回不是ostream的某些ostringstream,则会发生不好的事情。我唯一想做的是类似

string str = ([&] () -> string {ostringstream stream; stream << whatever; return stream.str();})();

但这可能效率不高,并且肯定是非常糟糕的c ++代码。


*好吧,我不需要,但这会方便得多。

3 个答案:

答案 0 :(得分:3)

使用

string str = ([&] () -> string
             {
               ostringstream stream;
               stream << whatever;
               return stream.str();
              })();

可以。但是,我认为最好为该操作命名,使用该名称创建一个函数,然后调用该函数。

namespace MyApp
{
    template <typename T>
    std::string to_string(T const& t)
    {
        ostringstream stream;
        stream << t;
        return stream.str();
    }
}

然后使用

string str = MyApp::to_string(whatever);

答案 1 :(得分:2)

  

我唯一想做的就是类似

string str = ([&] () -> string {ostringstream stream; stream << whatever; return stream.str();})();
     

但是这不可能高效,并且肯定是非常糟糕的c ++   代码。

实际上,不。一旦优化器对此进行了研究,它就和原始代码一样快。它不是“非常糟糕的C ++代码”。它被称为立即调用的Lambda表达式或IILE。这是一个习惯用法,实际上是相当体面的做法。

最好采用以下格式:

// One of the benefits of IILEs is that `const` can be used more frequently
string const str = [&] {
    ostringstream stream;
    stream << whatever;
    return stream.str();
}();

有些人更喜欢使用std::invoke来调用lambda:

string const str = std::invoke([&] {
    ostringstream stream;
    stream << whatever;
    return stream.str();
});

答案 2 :(得分:1)

假设您有

std::string get_str(std::ostream& out) {
    retrun static_cast<std::stringbuf*>(out.rdbuf())->str();
}

您可以使用

std:: string s = get_str(std::ostringstream{} << ...);