我想用这样的代码直接读入一个字符串:
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()
在线演示:
- GCC output 没有
-std=c++11
- Clang output 没有
-std=c++11
C++11
在 C++11 中,通过添加一个非成员函数 (27.7.3.9) 解决了这个问题,该函数将第一个参数作为右值引用,然后将调用转发给适当的函数,无论是成员函数还是非成员函数.所以它打印XYZ
其次是 ABC
:
- GCC output 与
-std=c++11
- Clang output 与
-std=c++11
关于c++ - 使用匿名 Stringstream 构造字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19665458/