我使用的是openDDS pub/sun中间件。我已经使用复杂的结构测试了openDDS。
例如
typedef struct DSMD
{
string a;
long b;
} StandByModeData;
struct DSMCD{
string SessionId;
DSMD Data;
};
但现在我有了不同的结构。它通过了openDDS。
如何在idl结构中使用模板?
我需要这样的东西。
template <struct T>
struct array {
T typr;
};
这是OpenDDS目前无法实现的。IDL3+确实定义了模板化模块,这与您的示例类似,但据我所知,OpenDDS或任何其他DDS供应商都不支持。
eProsima的快速RTPS可以使用DDS(也称为动态类型生成器)支持各种数据类型,一些示例动态生成器可以参考此处,github repo可以参考https://github.com/eProsima/Fast-RTPS。IMHO,当数据类型支持std::string类型时,它可以支持任何类型的数据类型,因为std::字符串是一个通用的选择。对于不确定的数据类型,可以将数据强制转换为json格式的字符串以通过DDS。我一直在做这样的事情,稍后会在这里转发进一步的进展。
您可以创建自己的VMF(可变消息格式)消息类型。我现在正在编写的代码使用这个概念,使用eprosima FastDDS在节点/参与者之间传递消息。OpenDDS和FastDDS可以使用相同的idl文件。在某些情况下,我们同时使用这两种DDS实现。
@topic
struct VariableMessageType
{
/* Message id */
long msg_id;
/* Number of bytes in the data vector */
/* units: none */
long num_bytes;
/* num_bytes sized array of bytes */
/* units: none */
sequence<octet> data;
};