如何在不创建命名字符串流的情况下流入字符串?

时间:2016-08-18 03:12:50

标签: c++

我经常写这样的代码:

SomeStreamableType x;
std::stringstream ss;
ss << "Value is: " << x;
log(ss.str());

生成字符串流所需的额外行感觉非常丰富。我可以做到这一点,但它同样很麻烦:

SomeStreamableType x;
const std::string str =  "Value is: " + boost::lexical_cast<std::string>(x);
log(str);

我希望能够做到这一点:

SomeStreamableType x;
log(std::stringstream() << "Value is: " << x);

让其他人遇到此问题并提出解决方法吗? 我不想创建任何帮助函数或类

2 个答案:

答案 0 :(得分:5)

只要log接受ostream&引用,您的代码就可以无需修改即可使用:

void log(ostream& o) {
    stringstream* s = dynamic_cast<stringstream*>(&o);
    if (s) {
        cout << s->str() << endl;
    }
}

int main() {
    int x = 5, y = 6;
    log(stringstream() << "x=" << x << ", y=" << y);
    return 0;
}

Demo.

答案 1 :(得分:2)

为了解决这个问题,我经常做这样的事情:

#define LOG(m) do{std::ostringstream oss;oss<<m;std::cout<<oss.str()<<'\n';}while(0)

// ...

LOG("some text: " << value1 << ' ' << value2); // no need for '\n'

现在我倾向于使用更复杂的基于类的解决方案,它具有更好的界面,并且不会使用可怕的宏。