我有一个代表内存缓冲区的类
class Buffer
{
public:
Buffer(const char* buffer, size_t size)
:m_buffer(buffer), m_size(size)
{
}
const char* m_buffer;
size_t m_size;
};
我需要在此类上重载operator<<
,以便可以将其写入std::stringstream
这样的
char arr[] = "hello world";
Buffer buf(arr, 11);
std::stringstream ss;
ss << buf;
我该怎么做?请注意,内存缓冲区之间可能有NULL
个字符。此外,由于内存缓冲区可能很大,我想避免为此创建任何额外的副本(除了复制到stringstream中)。
答案 0 :(得分:4)
始终对输出流写入流。
如果您看到例如this std::stringstream
reference您会看到它继承自std::iostream
继承自std::ostream
(以及std::istream
)。
这意味着你只需要像这样重载:
class Buffer
{
public:
...
friend std::ostream& operator<<(std::ostream& os, Buffer const& buf)
{
// Code to write the buffer to the stream...
}
};
这个重载当然意味着您可以使用Buffer
类来写入任何输出流。
写入数据的重载函数究竟需要什么取决于数据。它可以是任何通用二进制数据,那么您应该使用std::ostream::write
。否则你可以使用例如std::string
充当中间人:
return os << std::string(m_buffer, m_size);
您当然需要确保缓冲区不为空或空指针。
答案 1 :(得分:1)
在std::ostream::write
重载中使用operator<<
()将缓冲区写入std::ostream
。
这将写入所有内容,null bytes,等等。