1

我想使用<<运算符来填充外部缓冲区,

我尝试从 继承iostream,然后每次使用<<到我的类时,我都会将内容复制到当前缓冲区位置,并增加缓冲区位置...

我没有运气,我查看了一些在线示例或教程,但我有点迷路了。如何使用类和重载运算符将T 类型<<的变量复制到缓冲区中?

有什么方向吗?

我上课的概述:

class CBufferedMem
{
public:
    CBufferedMem(unsigned char* buffer, unsigned int size);
    char ReadFromBuffer(void* dst, unsigned char length);
    char writeToBuffer(void src, unsigned char length);
private:
    unsigned char* buffer;
    unsigned short buffSize;
    unsigned char* currentTmpLocation;
    unsigned char* endOfBuffer;
};
4

2 回答 2

2

最简单的解决方案是直接使用特殊的缓冲类并重载所需的输出运算符:

struct buffer_class
{
    // The data needed...
};

inline buffer_class& operator<<(buffer_class& buffer, const std::string& s)
{
    // Code to add the string to the buffer
    return buffer;
}

inline buffer_class& operator<<(buffer_class& buffer, const uint8_t ub)
{
    // Code to add the value to the buffer
    return buffer;
}

inline buffer_class& operator<<(buffer_class& buffer, const int8_t sb)
{
    // Code to add the value to the buffer
    return buffer;
}

为所需的所有数据添加更多运算符重载。


例如,它可能是这样的:

struct buffer_class
{
    std::vector<int8_t> data;
};

inline buffer_class& operator<<(buffer_class& buffer, const std::string& s)
{
    for (const auto& ch : s)
        buffer.data.push_back(static_cast<unt8_t>(ch));
    return buffer;
}

inline buffer_class& operator<<(buffer_class& buffer, const uint8_t ub)
{
    buffer.data.push_back(static_cast<int8_t>(ub));
    return buffer;
}

inline buffer_class& operator<<(buffer_class& buffer, const int8_t sb)
{
    buffer.data.push_back(sb);
    return buffer;
}

然后你可以像这样使用它:

buffer_class my_buffer;

buffer << std::string("Hello") << 123:

// The raw data can now be accessed by `my_buffer.data.data()`
于 2013-06-17T01:50:57.620 回答
1

您不想从 iostream 继承来执行此操作。

您要做的是编写自己的流缓冲区类,将其数据发送到套接字或消息队列。

周围有各种套接字流类演示了如何执行此操作。其中许多(大多数?)都相当老了,因为流模型在套接字上并不能很好地工作,但是如果你想尝试一下,代码就在那里(包括源代码,所以它展示了如何做同样的事情你自己——这实际上并不难)。

于 2013-06-17T02:35:07.377 回答