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

标签 c++ string sstream

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

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/

相关文章:

c++ - c++ 中的 stoi 关键字使用什么库

c++ - stringstream 到底是做什么的?

c++ - 如何在 boost::circular 缓冲区上使用 boost::regex?

Linux GCC 上 <emmintrin.h> 的 C++ 编译问题

c++ - 如何编写跳过 C++ 代码行的预处理器定义?

java - 在 Java 中拆分字符串 : lookahead and lookbehind with variable length

java - 如何使 JNI RegisterNatives callack Java 函数具有 C++ 实例范围?

python - 即使顺序不同,如何检查字符串中的单词 - PYTHON

regex - CMake:如何在 Regexp 替换中获取反斜杠文字?

c++ - 在 C++ 中将未知类传递给字符串流