如何在 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 文本和二进制表示。
我正在尝试制作一个 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 文本和二进制表示。