【问题标题】:How to pass a C++ Map into a RTI DDS connext Publisher and receive at RTI Subscriber如何将 C++ Map 传递到 RTI DDS connext Publisher 并在 RTI Subscriber 处接收
【发布时间】:2013-07-24 18:11:45
【问题描述】:

我是 RTI DDS connext 的新手。我尝试运行 rti 的一些 C++ 示例(Hello_dynamic,Hello_simple),它们工作正常。然后我想将 C++ 映射作为主题类型从发布者传递给订阅者。但我猜他们没有文档和示例代码可用于执行此操作.请在这里帮我..??

【问题讨论】:

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


    【解决方案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 表示该项属于哪个地图。您的地图是具有相同 m_mapId 值的所有 mapItems 的集合。 m_keym_value 字段显然是键值对。

    在发布者方面,您的应用程序可以将地图元素一一写入 DDS。 m_mapIdm_key 具有相同值的值将相互覆盖,从而导致与标准映射的预期行为相同。在订阅方,可以通过在数据读取器中查询所有具有相同m_mapId 的 mapItems 来构建完整的地图。

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

    如果您熟悉常规数据库设计,您会注意到与在关系数据模型中进行设计时所做的相似。实际上,DDS 可以被认为是一种分布式数据管理基础架构,与常规 DBMS-es 有很多相似之处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      • 2019-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      相关资源
      最近更新 更多