C++ 在 << 作为参数后使用 stringstream

标签 c++ concatenation stringstream

是否可以编写一个接受字符串流并使其看起来像这样的方法,

void method(string str)
void printStringStream( StringStream& ss)
{
    method(ss.str());
}

可以这样调用

stringstream var;
printStringStream( var << "Text" << intVar << "More text"<<floatvar);

我查找了 << 运算符,它看起来像返回一个 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");
}

这是我所希望的那样干净和可读。

希望这可以帮助其他人清理写入的消息。

最佳答案

啊,花了我一分钟。自 operator<<是为所有 ostream 类型重载的自由函数,它不返回 std::stringstream , 它返回一个 std::ostream就像你说的。

void printStringStream(std::ostream& ss)

现在清楚了,一般ostream我们没有 .str()成员,但他们确实有一种将整个流复制到另一个流的神奇方法:

std::cout << ss.rdbuf();

这是完整代码的链接,显示它可以正常编译和运行 http://ideone.com/DgL5V

编辑

如果你真的需要函数中的字符串,我可以想到几个解决方案:

首先,单独进行流式传输:

stringstream var;
var << "Text" << intVar << "More text"<<floatvar;
printStringStream(var);

其次:将流复制为字符串(可能的性能问题)

void printStringStream( ostream& t)
{
    std::stringstream ss;
    ss << t.rdbuf();
    method(ss.str());
}

第三:让其他函数也接受流

关于C++ 在 << 作为参数后使用 stringstream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12519829/

相关文章:

c++ - 编译器选择不使用 REP MOVSB 指令进行字节数组移动

C++ SFML 错误 sf::NonCopyable::Noncopyable

c++ - 二叉搜索树的搜索函数出错

php - 难以在 HTML 表单下拉菜单中从 DB 联系的两个字符串之间添加空格

c++ - 如何使用多种方式分离 token

c++ - 为什么 to_string 没有模板化?

c++ - 使用带有 char 数组参数的 strtok

java - 如何在 JSTL/JSP 的循环中连接字符串?

sql-server - 连接单列表中的每 2 行

c++ - 使用 std::setw 后从流输出时如何清除宽度?