I am new to RTI DDS connext. I tried running some C++ examples(Hello_dynamic,Hello_simple) of rti and they where working fine.Then i thought of passing a C++ map as Topic type from publisher to Subscriber.But i guess their is no documentation and example codes are available for doing this. Please help me here ..??
1 回答
C++ 标准映射类型本身不能用作主题类型。DDS 可以分发可以由 OMG 的 IDL(接口定义语言)的定义子集表示的任何类型,而映射类型不在其中。
您提到的两个代码示例不是您的典型情况,因为它们依赖于内置的字符串类型 (Hello_simple) 或专有的动态数据 API (Hello_dynamic)。要更好地了解您通常如何定义自己的数据类型,请查看 Hello_idl 示例。它显示了在 IDL 中定义的用户定义类型,该类型被转换为 C++ 类型以供您的应用程序使用。
创建一个 Topic 类型来实现类似于C++ 映射的功能是相当容易的。假设您的地图项具有字符串键和长值,那么您可以使用 IDL 中的结构来表示地图中的单个项目,例如使用以下类型:
struct mapItem {
unsigned long m_mapId; //@key
string m_key; //@key
long m_value;
};
m-mapId
表示该项目属于哪个地图。您的地图是所有mapItem
具有相同m_mapId
值的 s 的集合。字段m_key
和m_value
显然是键值对。
在发布方,您的应用程序可以将地图元素一一写入 DDS。具有相同值的值m_mapId
和m_key
将相互覆盖,从而产生与标准地图预期相同的行为。在订阅方,可以通过在数据读取器中查询所有具有相同m_mapId
.
使用此方法时,您的应用程序代码将不会使用标准映射。为了实现这一点,您必须创建包装函数,将 map(-like) API 转换为相应的写入和读取操作。
如果您熟悉常规数据库设计,您会注意到与在关系数据模型中进行设计时所做的相似。实际上,DDS 可以被认为是一种分布式数据管理基础设施,与常规 DBMS-es 有很多相似之处。