Как вызвать универсальную структуру в переполнении стека

Я пытаюсь создать класс, в котором мы можем кодировать и декодировать различные структуры от и до символа *.

Я делаю это следующим образом, я сделал реферат
универсальный класс под названием 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
}

И с заголовком:

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

Этот класс расширяется реальными классами, такими как CANintegermsg, в котором конструктор этого класса вводит структуру:

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

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

Идея в том, что вы можете установить определенный тип структуры в каждом расширенном классе. Проблема в том, что C ++ не распознает виртуальные структуры. Я мог бы переместить функции кодирования и декодирования в каждый расширенный класс, но так как их много, это привело бы к дублированию кода. Существует ли удобный способ использовать функции кодирования и декодирования, подобные этой?

1

Решение

Вы можете использовать шаблоны:

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>;
0

Другие решения

Это звучит (пожалуйста, поправьте меня, если я ошибаюсь), как будто вы пытаетесь повторно реализовать что-то вроде Буферы протокола (protobufs).
Вы можете использовать комбинацию сообщений protobuf, вложенных сообщений и расширения чтобы достичь вашей цели.

Protobufs также легко конвертировано в & разобрали с текстовые и двоичные представления.

1