RTI Connext 现代 C++ DDS API 关键增强解析
自推出 DDS 现代 C++ API 以来,客户反响热烈。许多已基于 C++11 构建新系统,我们持续优化 API,引入多项影响深远的增强。
增强的 IDL 到现代 C++ 映射
RTI 代码生成器新增 -stl 选项,配合 -language C++03 或 -language C++11 使用。此选项更新多个 IDL 类型映射:
- 无界序列 →
std::vector(需 -unboundedSupport) - 有界序列 →
rti::core::bounded_sequence<T, Bound>。此类型行为似std::vector但针对反序列化优化。追求更低延迟可用@use_vector注解选std::vector - 字符串和宽字符串类型 →
std::string和std::wstring - 用
@external注解的成员(「*」指针符号)变为dds::core::external<T>,类似shared_ptr的更安全包装器。保护外部成员在中间件借用内存时(如从LoanedSamples容器读取)不被覆写
例如给定以下 IDL 类型:
struct MyType { sequence<long> my_unbounded_seq; sequence<long, 10> my_bounded_seq; @use_vector sequence<long, 10> my_other_bounded_seq string my_str; @external long my_external; };
使用命令 rtiddsgen -language C++11 -stl -unboundedSupport MyType.idl,生成的 C++11 类如下:
class MyType { public: MyType(); ... MyType (MyType&&) = default; MyType& operator=(MyType&&) = default; MyType& operator=(const MyType&) = default; MyType(const MyType&) = default; std::vector<int32_t>& my_unbounded_seq() noexcept; const std::vector<int32_t>& my_unbounded_seq() const noexcept; void my_unbounded_seq(const std::vector<int32_t>& value); rti::core::bounded_sequence<int32_t, 10>& my_bounded_seq() noexcept; const rti::core::bounded_sequence<int32_t, 10>& my_bounded_seq() const noexcept; void my_bounded_seq(const rti::core::bounded_sequence<int32_t, 10>& value); std::vector<int32_t>& my_other_bounded_seq() noexcept; const std::vector<int32_t>& my_other_bounded_seq() const noexcept; void my_other_bounded_seq(const std::vector<int32_t>& value); std::string& my_str() noexcept; const std::string& my_str() const noexcept; void my_str(const std::string& value); dds::core::external<int32_t>& my_external() noexcept; const dds::core::external<int32_t>& my_external() const noexcept; void my_external(dds::core::external<int32_t> value); ... };
现代 C++ 请求-应答 API
API 新增两个实体:rti::request::Requester 和 rti::request::Replier。提供原生请求-应答模式,其他语言已有,5.3 原型引入,5.3.0.7 生产就绪。
简洁代码示例见 此处。
小幅 API 增强
简化若干常见任务:
WaitSet中条件处理器现可接受条件为参数,无需无参函子:
condition.handler([]() { // do something }); // 或用新签名 condition.handler([](dds::core::cond::Condition c) { // do something (condition == c) });
TopicQuery:按需历史数据
TopicQuery 5.3 引入,允许应用按需检索历史数据。现代 C++ API 中可从 DataReader 创建 TopicQuery:
rti::sub::TopicQuery my_topic_query( my_reader, rti::sub::TopicQuerySelection(dds::topic::Filter("x < 10")) );
随后可获取匹配过滤器的历史样本,同时正常接收实时数据。
展望未来
C++17 已定案、C++20 在即,RTI Connext 将持续以现代语言特性和性能改进演进 C++ API。保持关注或订阅 RTI 博客获取最新动态。
物联网技术