现代 C++ API 的新增功能
自从我们为 DDS 引入现代 C++ API 以来,我们已经看到了很多客户的兴趣。他们中的一些人已经开始用 C++11 开发全新的系统。我们也一直在不断改进 API,我想在这里谈谈一些大大小小的新功能。
改进了 IDL 到 C++ 的映射。 代码生成器提供了一种新的、增强的现代 C++ 映射。一个新选项,-stl , 结合 -language C++03 或 -语言 C++11 启用它。
此选项更改以下 IDL 类型的映射:
- 无界序列映射到
std::vector
(这需要 -unboundedSupport ) - 有界序列映射到
rti::core::
bounded_sequence。此类型类似于 std::vector,但针对数据反序列化进行了优化。如果最小化延迟不是首要问题,或者 T 很简单,您可以选择将有界序列映射到 std::vector
以及新的@use_vector IDL 注释。 - 字符串和宽字符串映射到
std::string,
和std::wstring
- 具有新注解@external(相当于“*”指针表示法)的成员映射到新类型
dds::core::external
类似于, shared_ptr。
这个包装器提供了一种更安全的替代方法,可以替代之前到原始指针的映射。当从中间件借出内存时(例如,当读取一个LoanedSamples
容器)。
例如,给定以下 IDL 类型:
struct MyType {
序列my_unbounded_seq;
序列my_bounded_seq;
@use_vector 序列my_other_bounded_seq
字符串 my_str;
@external long my_external;
};
这就是使用“-stl”生成的 C++11 类型的样子
(完整命令:rtiddsgen -language C++11 -stl -unboundedSupport MyType.idl )
class MyType {
上市:
我的风格();
...
MyType (MyType&&) =默认值;
MyType&operator=(MyType&&) =default;
MyType&operator=(const MyType&) =default;
MyType(const MyType&) =默认值;
std::vector&my_unbounded_seq() noexcept;
const std::vector&my_unbounded_seq() const noexcept;
void my_unbounded_seq(const std::vector&value);
rti::core::bounded_sequence&my_bounded_seq() noexcept;
const rti::core::bounded_sequence&my_bounded_seq() const noexcept;
void my_bounded_seq(const rti::core::bounded_sequence&value);
std::vector&my_other_bounded_seq() noexcept;
const std::vector&my_other_bounded_seq() const noexcept;
void my_other_bounded_seq(const std::vector&value);
std::string&my_str() noexcept;
const std::string&my_str() const noexcept;
void my_str(const std::string&value);
dds::core::external&my_external() noexcept;
const dds::core::external&my_external() const noexcept;
void my_external(dds::core::externalvalue);
...
};
请求-回复 API。 现代 C++ 的新请求-回复 API 使用两个实体扩展了 DDS API:rti::request::Requester
和 rti::request::Replier
.这个 API 已经在其他语言中可用,现在在现代 C++ 中作为 5.3 的原型和 5.3.0.7 的生产就绪可用。
此处提供了一个简单的代码示例。
我们进行了额外的小改进 使 API 更易于使用。例如,我们简化了如何使用处理程序在 WaitSet 中分派条件。以前,处理程序必须是无参数函子。现在他们可以将 Condition 作为参数。
condition.handler([]() {
// 做一点事
});
// 现在我们也支持
条件处理程序([](dds::core::cond::Condition c){
// 做某事(条件 ==c)
});
我们还通过新的连接功能使 API 保持最新状态 ,比如我们在 5.3 中介绍的 TopicQuery。主题查询为应用程序提供了一种按需接收历史数据的可扩展机制。
在现代 C++ API 中,您可以从 DataReader 创建一个 TopicQuery 实例,如下所示:
rti::sub::TopicQuery my_topic_query(
我的读者,
rti::sub::TopicQuerySelection(dds::topic::Filter("x <10")));
现在您可以使用 my_reader 从所有通过过滤器的匹配 DataWriter 中获取历史数据样本。您还可以像往常一样继续阅读“实时”数据。
随着 C++17 刚刚获得批准,C++20 即将到来,我们将继续使用令人兴奋的功能更新和现代化我们的 C++ API。请继续关注或订阅 RTI 博客以获取所有最新更新!
物联网技术