如何在 C++ 中调用泛型结构

How to call generic struct in C++

我正在尝试制作一个 class,我们可以在其中对来自 char* 的不同结构进行编码和解码。

我正在按照以下方式执行此操作,我制作了一个摘要 泛型 class 称为 CANgenericMsg,CANgenericMsg.cpp 为:

#include "CANgenericMsg.h"

CANgenericMsg::CANgenericMsg() {
     // TODO Auto-generated constructor stub

}

void CANgenericMsg::decode(char* chars) {
    CANgenericMsg::str* data = reinterpret_cast<CANgenericMsg::str*>(chars);
    structure = *data;
}

char* CANgenericMsg::encode() {
     return reinterpret_cast<char*>(&structure);
}


CANgenericMsg::~CANgenericMsg() {
    // TODO Auto-generated destructor stub
}

与 header:

class CANgenericMsg {
public:
    CANgenericMsg();
    void decode(char* chars);
    virtual ~CANgenericMsg();
    char* encode();
    virtual struct str structure;
};

这个class被真正的class扩展,例如CANintegermsg,其中这个class的构造函数初始化结构:

class CANintegermsg: public CANgenericMsg {
public:
     CANintegermsg(int i);
     virtual ~CANintegermsg();

    struct str {
        unsigned short int my_int;
    } structure;
};

想法是您可以在每个扩展 class 中设置特定的结构类型。问题是 C++ 不识别虚拟结构。我可以将编码和解码函数移动到每个扩展 class,但由于它们很多,这会导致代码重复。有没有一种巧妙的方法可以像这样使用编码和解码函数?

您可以使用模板:

template<class T>
class CANGenericMsg 
{
public:
    CANGenericMsg(const T val) : m_structureObj(val) {}
    void decode(char* chars)
    {
        T* data = reinterpret_cast<T*>(chars);
        m_structureObj = *data;
    }
    char* encode()
    {
        return reinterpret_cast<char*>(&m_structureObj);
    }
private:
    T m_structureObj;
};

struct StructUShortInt { unsigned short int my_int; };
using CANIntegerMsg = CANGenericMsg<StructUShortInt>;

听起来(如果我错了请纠正我)就像你在尝试 re-implement 类似 Protocol Buffers (protobufs) 的东西。 您可以结合使用 protobuf 消息 sub-messages 和 extensions 来实现您的目标。

Protobufs 也很容易 converted to & parsed from 文本和二进制表示。