Dan*_*Dan 7 c++ concatenation stringstream
是否有可能编写一个采用字符串流并使其看起来像这样的方法,
void method(string str)
void printStringStream( StringStream& ss)
{
method(ss.str());
}
Run Code Online (Sandbox Code Playgroud)
并且可以像这样调用
stringstream var;
printStringStream( var << "Text" << intVar << "More text"<<floatvar);
Run Code Online (Sandbox Code Playgroud)
我查找<<运算符,看起来它返回一个ostream&对象,但我可能读this错了或者没有正确执行它.
我真正想要的只是一种将字符串连接在一起并将其传递给函数的简洁方法.我能找到的最干净的东西是一个stringstream对象,但仍然有很多不足之处.
笔记:
我不能使用很多c++11答案,因为我在Visual Studio 2010上运行(违背我的意愿,但仍然)
我有机会Boost这么坚持下去.
只要清理这个烂摊子我就不会反对自定义方法.
编辑:
随着@Mooing Duck的回答与@PiotrNycz语法的混合我实现了我这样编写代码的目标,
try{
//code
}catch(exception e)
{
printStringStream( stringstream() << "An exception has occurred.\n"
<<" Error: " << e.message
<<"\n If this persists please contact "<< contactInfo
<<"\n Sorry for the inconvenience");
}
Run Code Online (Sandbox Code Playgroud)
这是我所希望的那样清洁和可读.
希望这有助于其他人清理写信息.
啊,花了我一分钟.因为operator<<是一个为所有 ostream类型重载的自由函数,它不返回a std::stringstream,它返回一个std::ostream你说的.
void printStringStream(std::ostream& ss)
Run Code Online (Sandbox Code Playgroud)
现在显然,一般ostreams没有.str()成员,但他们确实有一种神奇的方法可以将一个完整的流复制到另一个:
std::cout << ss.rdbuf();
Run Code Online (Sandbox Code Playgroud)
这里是完整代码的链接,显示它编译并运行良好http://ideone.com/DgL5V
如果你真的需要函数中的字符串,我可以想到一些解决方案:
首先,单独进行流式处理:
stringstream var;
var << "Text" << intVar << "More text"<<floatvar;
printStringStream(var);
Run Code Online (Sandbox Code Playgroud)
第二步:将流复制到字符串(可能的性能问题)
void printStringStream( ostream& t)
{
std::stringstream ss;
ss << t.rdbuf();
method(ss.str());
}
Run Code Online (Sandbox Code Playgroud)
第三:让其他功能也采取流