Apa yang Baru di Modern C++ API
Sejak kami memperkenalkan C++ API modern untuk DDS, kami telah melihat banyak minat dari pelanggan kami. Beberapa dari mereka telah mulai mengembangkan sistem baru di C++ 11. Kami juga terus meningkatkan API dan ada beberapa fitur baru, besar dan kecil, yang ingin saya bicarakan di sini.
Peningkatan pemetaan IDL ke C++. Code Generator menyediakan pemetaan baru yang disempurnakan untuk C++ modern. Opsi baru, -stl , dikombinasikan dengan -bahasa C++03 atau -bahasa C++11 mengaktifkannya.
Opsi ini mengubah pemetaan jenis IDL berikut:
- Peta urutan tak terbatas ke
std::vector
(ini membutuhkan -unboundedSupport )
- Peta urutan yang dibatasi ke
rti::core::
bounded_sequence. Jenis ini mirip dengan std::vector, tetapi dioptimalkan untuk deserialisasi data. Jika meminimalkan latensi bukanlah perhatian utama, atau T sederhana, Anda dapat memilih untuk memetakan urutan yang dibatasi ke std::vector
juga dengan anotasi IDL @use_vector baru.
- String dan string lebar dipetakan ke
std::string,
danstd::wstring
masing-masing.
- Anggota dengan anotasi baru @external (setara dengan notasi penunjuk “*”) memetakan ke tipe baru
dds::core::external,
mirip denganshared_ptr.
Pembungkus ini memberikan alternatif yang lebih aman untuk pemetaan sebelumnya ke pointer mentah. Anggota eksternal tidak dapat ditimpa saat memorinya dipinjam dari middleware (misalnya, saat membacaLoanedSamples
wadah).
Misalnya, diberikan tipe IDL berikut:
struct MyType {
sequence my_unbounded_seq;
sequence my_bounded_seq;
@use_vector sequence my_other_bounded_seq
string my_str;
@eksternal panjang my_external;
};
Ini adalah tampilan tipe C++11 yang dihasilkan dengan “-stl”
(Perintah lengkap:rtiddsgen -bahasa C++11 -stl -unboundedSupport MyType.idl )
kelas MyType {
publik:
Tipe ku();
...
Jenis Saya (Jenis Saya&&) =default;
Jenis Saya&operator=(Jenis Saya&&) =default;
Jenis Saya&operator=(const Jenis Saya&) =default;
MyType(const MyType&) =default;
std::vector&my_unbounded_seq() noexcept;
const std::vector&my_unbounded_seq() const noexcept;
void my_unbounded_seq(const std::vector&nilai);
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&nilai);
std::vector&my_other_bounded_seq() noexcept;
const std::vector&my_other_bounded_seq() const noexcept;
void my_other_bounded_seq(const std::vector&nilai);
std::string&my_str() tidak ada kecuali;
const std::string&my_str() const noexcept;
void my_str(const std::string&nilai);
dds::core::external&my_external() noexcept;
const dds::core::external&my_external() const noexcept;
void my_external(dds::core::external nilai);
...
};
API permintaan-balasan. API permintaan-balasan baru untuk C++ modern memperluas API DDS dengan dua entitas:rti::request::Requester
dan rti::request::Replier
. API ini sudah tersedia dalam bahasa lain, dan sekarang tersedia dalam C++ modern sebagai prototipe di 5.3 dan siap produksi di 5.3.0.7.
Contoh kode sederhana tersedia di sini.
Kami telah membuat peningkatan kecil tambahan untuk membuat API lebih mudah digunakan. Misalnya, kami menyederhanakan cara menggunakan penangan untuk mengirimkan Kondisi di WaitSet. Sebelumnya, penangan harus menjadi fungsi tanpa argumen. Sekarang mereka dapat mengambil Kondisi sebagai argumen.
kondisi.handler([]() {
// lakukan sesuatu
});
// sekarang kami juga mendukung
condition.handler([](dds::core::cond::Condition c) {
// melakukan sesuatu (kondisi ==c)
});
Kami juga terus memperbarui API dengan fitur konektivitas baru , seperti TopicQuery, yang kami perkenalkan di 5.3. Kueri topik menyediakan mekanisme yang dapat diskalakan bagi aplikasi untuk menerima data historis sesuai permintaan.
Di C++ API modern, Anda dapat membuat instance TopicQuery dari DataReader sebagai berikut:
rti::sub::TopicQuery my_topic_query(
pembaca_saya,
rti::sub::TopicQuerySelection(dds::topic::Filter("x <10")));
Sekarang Anda dapat menggunakan my_reader untuk mengambil sampel data historis dari semua DataWriters yang cocok yang lolos filter. Anda juga dapat terus membaca data "langsung" seperti biasa.
Dengan C++17 baru saja disetujui dan C++20 sudah dekat, kami terus memperbarui dan memodernisasi C++ API kami dengan fitur-fitur menarik. Tetap disini atau cukup berlangganan Blog RTI untuk semua pembaruan terbaru!