我经常写这样的代码:
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);
让其他人遇到此问题并提出解决方法吗? 我不想创建任何帮助函数或类。
答案 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;
}
答案 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'
现在我倾向于使用更复杂的基于类的解决方案,它具有更好的界面,并且不会使用可怕的宏。