Что нового в современном C ++ API
С тех пор, как мы представили современный C ++ API для DDS, мы заметили большой интерес со стороны наших клиентов. Некоторые из них начали разработку совершенно новых систем на C ++ 11. Мы также постоянно улучшаем API, и есть несколько новых функций, больших и малых, о которых я хотел бы здесь поговорить.
Улучшенное сопоставление IDL с C ++. Генератор кода обеспечивает новое улучшенное сопоставление с современным C ++. Новый параметр -stl , в сочетании с -языком C ++ 03 или -язык C ++ 11 позволяет это.
Этот параметр изменяет сопоставление следующих типов IDL:
- Неограниченные последовательности отображаются в
std ::vector
(для этого требуется -unboundedSupport ) - Ограниченные последовательности сопоставляются с
rti ::core ::
bounded_sequence. Этот тип похож на std ::vector, но оптимизирован для десериализации данных. Если минимизация задержки не является первоочередной задачей или T прост, вы можете выбрать отображение ограниченных последовательностей в std ::vector
а также с новой аннотацией IDL @use_vector. - Строки и широкие строки сопоставляются с
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;
};
Вот как сгенерированный тип C ++ 11 выглядит с «-stl»
(Полная команда: rtiddsgen -language C ++ 11 -stl -unboundedSupport MyType.idl )
class MyType {
общественность:
Мой тип();
...
MyType (MyType &&) =по умолчанию;
MyType &operator =(MyType &&) =по умолчанию;
MyType &operator =(const MyType &) =по умолчанию;
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 ::external);
...
};
API запроса-ответа . Новый API запроса-ответа для современного C ++ расширяет API DDS двумя объектами: rti ::request ::Requester
и rti ::request ::Replier
. Этот API уже был доступен на других языках, а теперь доступен в современном C ++ в качестве прототипа в версии 5.3 и готов к производству в версии 5.3.0.7.
Здесь доступен простой пример кода.
Мы внесли дополнительные небольшие улучшения чтобы упростить использование API. Например, мы упростили использование обработчиков для отправки условий в WaitSet. Раньше обработчики должны были быть функторами без аргументов. Теперь они могут принять Условие в качестве аргумента.
condition.handler ([] () {
// сделай что-нибудь
});
// теперь мы также поддерживаем
condition.handler ([] (dds ::core ::cond ::Condition c) {
// что-то делаем (условие ==c)
});
Мы также постоянно обновляли API, добавляя новые возможности подключения . , например TopicQuery, который мы представили в версии 5.3. Тематические запросы предоставляют приложениям масштабируемый механизм для получения исторических данных по запросу.
В современном API C ++ вы можете создать экземпляр TopicQuery из DataReader следующим образом:
rti ::sub ::TopicQuery my_topic_query (
my_reader,
rti ::sub ::TopicQuerySelection (dds ::topic ::Filter ("x <10")));
Теперь вы можете использовать my_reader, чтобы брать образцы исторических данных из всех подходящих DataWriter, прошедших фильтр. Вы также можете продолжать читать «живые» данные как обычно.
Поскольку C ++ 17 только что одобрен, а C ++ 20 не за горами, мы продолжаем обновлять и модернизировать наш C ++ API с помощью интересных функций. Следите за обновлениями или просто подпишитесь на блог RTI, чтобы получать все последние обновления!
Интернет вещей
- IoT знаменует новую эру для высоких улиц
- Потоковая передача данных открывает новые возможности в эпоху Интернета вещей
- Что остановит развертывание 5G?
- Пора перемен:новая эра на краю
- G.hn открывает двери новым промышленным возможностям
- Переосмысление интеллектуального производства для нового нормального
- Если данные относятся к новому маслу, кто ваш переработчик?
- Появление нового вида ИТ:гибрид ИТ / ОТ
- Офис закрыт? Microsoft объявляет о создании нового исследовательского инкубатора искусственного интеллекта
- std::list в C++ с примером