Peningkatan Utama dalam API DDS C++ Modern RTI Connext
Sejak kami memperkenalkan API C++ modern untuk DDS, kami telah melihat minat yang signifikan dari pelanggan kami. Banyak yang telah mulai membangun sistem baru menggunakan C++11, dan kami terus menyempurnakan API dengan sejumlah peningkatan yang berdampak.
Pemetaan IDL yang Ditingkatkan ke C++ Modern
Code Generator RTI sekarang menawarkan opsi baru -stl, yang digunakan bersamaan dengan -language C++03 atau -language C++11. Opsi ini memperbarui pemetaan beberapa tipe IDL:
- Sequences tidak terbatas →
std::vector (memerlukan -unboundedSupport) - Sequences terbatas →
rti::core::bounded_sequence<T, Bound>. Tipe ini berperilaku seperti std::vector tetapi dioptimalkan untuk deserialisasi. Untuk skenario latensi rendah, Anda mungkin lebih menyukai std::vector menggunakan anotasi @use_vector. - Tipe string dan wide string →
std::string dan std::wstring - Anggota yang dianotasi dengan
@external (notasi pointer “*”) menjadi dds::core::external<T>, pembungkus yang lebih aman mirip dengan shared_ptr. Ini melindungi anggota eksternal dari ditimpa saat middleware meminjam memori (misalnya, membaca dari kontainer LoanedSamples).
Contohnya, dengan tipe IDL berikut:
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; }; Menggunakan perintah rtiddsgen -language C++11 -stl -unboundedSupport MyType.idl, kelas C++11 yang dihasilkan terlihat seperti ini:
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); ... }; API Request-Reply untuk C++ Modern
API sekarang mencakup dua entitas baru: rti::request::Requester dan rti::request::Replier. Ini menyediakan pola request-reply asli, yang sudah tersedia dalam bahasa lain dan telah diperkenalkan dalam prototipe versi 5.3 dan siap produksi di 5.3.0.7.
Contoh kode ringkas tersedia di sini.
Peningkatan API yang lebih kecil
Kami telah menyederhanakan beberapa tugas umum:
- Penangan kondisi dalam
WaitSet sekarang dapat menerima kondisi sebagai argumen, menghilangkan kebutuhan untuk fungtor tanpa argumen:
condition.handler([]() { // do something }); // or, with the new signature condition.handler([](dds::core::cond::Condition c) { // do something (condition == c) }); TopicQuery untuk Data Historis On-Demand
TopicQuery, diperkenalkan di 5.3, memungkinkan aplikasi untuk mengambil data historis on-demand. Dalam API C++ modern Anda dapat membuat TopicQuery dari DataReader seperti ini:
rti::sub::TopicQuery my_topic_query( my_reader, rti::sub::TopicQuerySelection(dds::topic::Filter("x < 10")) ); Anda kemudian dapat mengambil sampel historis yang cocok dengan filter sambil masih menerima data langsung secara normal.
Menatap ke Depan
Dengan C++17 yang telah disetujui dan C++20 di dekat, RTI Connext akan terus berevolusi API C++ dengan fitur bahasa modern dan peningkatan performa. Tunggu atau langganan Blog RTI untuk pembaruan terbaru.