如何将C ++ Map传递到RTI DDS连接器发布者并在RTI订阅者处接收

时间:2013-07-24 18:11:45

标签: c++ data-structures map data-distribution-service

我是RTI DDS连接器的新手。我尝试运行rti的一些C ++示例(Hello_dynamic,Hello_simple),并且它们正常工作。然后我想将C ++映射作为Topic类型从发布者传递到Subscriber.But我想它们没有文档,并且示例代码可用于执行此操作。请帮帮我.. ??

1 个答案:

答案 0 :(得分:3)

C ++标准地图类型本身不能用作主题类型。 DDS可以分发任何可以由OMG的IDL(接口定义语言)的已定义子集表示的类型,并且地图类型不在其中。

您所指的两个代码示例不是典型情况,因为它们依赖于内置字符串类型(Hello_simple)或专有动态数据API(Hello_dynamic)。为了更好地了解如何定义自己的数据类型,请查看Hello_idl示例。它显示了在IDL中定义的用户定义类型,该类型被转换为C ++类型以供应用程序使用。

创建一个Topic类型以实现类似到C ++地图的功能相当容易。假设您的map-items具有字符串键和long值,那么您可以使用IDL中的结构来表示地图中的单个项目,例如使用以下类型:

struct mapItem {
    unsigned long m_mapId; //@key
    string m_key;          //@key
    long   m_value;
};

m-mapId表示此商品属于哪个地图。您的地图是具有相同mapItem值的所有m_mapId的集合。字段m_keym_value显然是键值对。

在发布者方面,您的应用程序可以逐个将地图元素写入DDS。 m_mapIdm_key具有相同值的值将相互覆盖,从而产生与标准地图相同的行为。在订阅者方面,可以通过查询具有相同m_mapId的所有mapItem的datareader来构建完整的地图。

使用此方法时,您的应用程序代码将不会使用标准地图。为了实现这一点,您必须创建包装函数,将映射(类似)API转换为相应的写入和读取操作。

如果您熟悉常规数据库设计,您会注意到在关系数据模型中设计它时与您将要执行的操作的相似性。实际上,DDS可以被认为是一种分布式数据管理基础设施,与常规DBMS有很多相似之处。