我使用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 ++代码。
*好吧,我不需要,但这会方便得多。
答案 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{} << ...);