gpt4 book ai didi

c++ - 使用匿名 Stringstream 构造字符串

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:52:37 27 4
gpt4 key购买 nike

我想用这样的代码直接读入一个字符串:

std::string myString(( std::ostringstream() << myInt << " "
<< myFloat << " "
<< std::boolalpha << myBool ).str());

但是 VS2012 向我投诉 basic_ostream 没有 str() 方法。

有没有办法用匿名字符串流做到这一点?

最佳答案

operator<<对于流返回 std::ostream &没有 str()成员函数。你需要使用 cast。

static_cast<std::ostringstream&>(std::ostringstream() << etc).str()

C++03和C++11使用临时流的区别!

C++03

但请注意(在 C++03 中)std::ostringstream()创建一个临时对象,这意味着 operator<<非成员 重载不能为第一个 << 调用因为他们都接受第一个参数为 std::ostream&不能绑定(bind)到临时对象。临时对象将能够调用仅成员 函数。

这意味着,以下将为您提供地址,而不是字符串:

static_cast<std::ostringstream&>(std::ostringstream() << "XYZ").str()

因为需要 char const* 的过载因为参数是一个非成员函数,它不能被调用,所以上面的代码最终调用了带void const*的成员函数。作为参数,因此 "XYZ"隐式转换为 void const* ,打印字符串文字的地址

一旦临时调用成员函数,剩下的链接<< 可能调用非成员重载,因为成员函数返回std::ostream& 现在 可以绑定(bind)到 operator<<非成员 重载的第一个参数.所以下面的代码将打印一个地址(而不是 "XYZ" )后跟字符串 "ABC" :

static_cast<std::ostringstream&>(std::ostringstream() << "XYZ" << "ABC").str()

在线演示:

C++11

在 C++11 中,通过添加一个非成员函数 (27.7.3.9) 解决了这个问题,该函数将第一个参数作为右值引用,然后将调用转发给适当的函数,无论是成员函数还是非成员函数.所以它打印XYZ其次是 ABC :

关于c++ - 使用匿名 Stringstream 构造字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19665458/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com