gpt4 book ai didi

c++ - 将对象直接流式传输到 std::string

转载 作者:IT老高 更新时间:2023-10-28 21:52:53 25 4
gpt4 key购买 nike

给定一些可流式传输的类型:

struct X {
int i;

friend std::ostream& operator<<(std::ostream& os, X const& x) {
return os << "X(" << x.i << ')';
}
};

我想将它附加到 std::string 上。我可以将其实现为:

void append(std::string& s, X const& x) {
std::ostringstream os;
os << x;
s.append(os.str());
}

但这似乎很蹩脚,因为我将数据写入一个流只是为了然后分配一个新字符串只是为了将它附加到另一个流中。有没有更直接的路线?

最佳答案

这可以通过 streambuf 的新类型来解决。 (见 Standard C++ IOStreams and Locales: Advanced Programmer's Guide and Reference)。

这是它的外观草图:

#include <streambuf>

class existing_string_buf : public std::streambuf
{
public:
// Store a pointer to to_append.
explicit existing_string_buf(std::string &to_append);

virtual int_type overflow (int_type c) {
// Push here to the string to_append.
}
};

一旦你在这里充实了细节,你就可以如下使用它:

#include <iostream>

std::string s;
// Create a streambuf of the string s
existing_string_buf b(s);
// Create an ostream with the streambuf
std::ostream o(&b);

现在您只需写入 o,结果应显示为附加到 s

// This will append to s
o << 22;

编辑

正如@rustyx 正确指出的那样,重写 xsputn 是提高性能所必需的。

完整示例

以下打印出22:

#include <streambuf>
#include <string>
#include <ostream>
#include <iostream>

class existing_string_buf : public std::streambuf
{
public:
// Somehow store a pointer to to_append.
explicit existing_string_buf(std::string &to_append) :
m_to_append(&to_append){}

virtual int_type overflow (int_type c) {
if (c != EOF) {
m_to_append->push_back(c);
}
return c;
}

virtual std::streamsize xsputn (const char* s, std::streamsize n) {
m_to_append->insert(m_to_append->end(), s, s + n);
return n;
}

private:
std::string *m_to_append;
};


int main()
{
std::string s;
existing_string_buf b(s);
std::ostream o(&b);

o << 22;

std::cout << s << std::endl;
}

关于c++ - 将对象直接流式传输到 std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38752936/

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