使用iostream运算符填充缓冲区

时间:2013-06-17 01:35:09

标签: c++ inheritance operator-overloading buffer iostream

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

我试图从iostream继承,然后每次我将<<用于我的类时,我将内容复制到当前缓冲区位置,并递增缓冲区位置...... < / p>

我没有运气,我查看了一些在线示例或教程,但我有点失落。如何使用类和重载<<运算符将类型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;
};

2 个答案:

答案 0 :(得分: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()`

答案 1 :(得分:1)

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

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

有各种socket stream类可以演示如何执行此操作。许多(大多数?)它们都相当陈旧,因为流模型在套接字上并不能很好地工作,但是如果你想尝试它,代码就在那里(包括源代码,所以它显示了如何做同样的事情)你自己 - 实际上并不是非常困难。)