Mejoras clave en la API Moderna C++ de DDS de RTI Connext
Desde que introdujimos la API moderna de C++ para DDS, hemos visto un interés significativo de nuestros clientes. Muchos han comenzado a construir nuevos sistemas usando C++11, y hemos continuado refinando la API con una serie de mejoras impactantes.
Mapeo IDL mejorado a C++ Moderno
El Generador de Código de RTI ahora ofrece una nueva opción -stl, usada junto con -language C++03 o -language C++11. Esta opción actualiza el mapeo de varios tipos IDL:
- Secuencias no acotadas →
std::vector(requiere -unboundedSupport) - Secuencias acotadas →
rti::core::bounded_sequence<T, Bound>. Este tipo se comporta comostd::vectorpero está optimizado para deserialización. Para escenarios de menor latencia puede preferirstd::vectorusando la anotación@use_vector. - Tipos string y wide string →
std::stringystd::wstring - Miembros anotados con
@external(la notación de puntero “*”) se convierten endds::core::external<T>, un wrapper más seguro similar ashared_ptr. Esto protege miembros externos de ser sobrescritos cuando el middleware presta memoria (ej. leyendo desde un contenedorLoanedSamples).
Por ejemplo, dado el siguiente tipo 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; };
Usando el comando rtiddsgen -language C++11 -stl -unboundedSupport MyType.idl, la clase C++11 generada se ve así:
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 para C++ Moderno
La API ahora incluye dos nuevas entidades: rti::request::Requester y rti::request::Replier. Estas proporcionan un patrón nativo request-reply, que ya está disponible en otros lenguajes y se introdujo en un prototipo en la versión 5.3 y está listo para producción en 5.3.0.7.
Un ejemplo de código conciso está disponible aquí.
Pequeñas mejoras en la API
Hemos simplificado varias tareas comunes:
- Los manejadores de condición en un
WaitSetahora pueden aceptar la condición como argumento, eliminando la necesidad de functores sin argumentos:
condition.handler([]() { // do something }); // o, con la nueva firma condition.handler([](dds::core::cond::Condition c) { // do something (condition == c) });
TopicQuery para datos históricos bajo demanda
TopicQuery, introducido en 5.3, permite a las aplicaciones recuperar datos históricos bajo demanda. En la API moderna de C++ puede crear un TopicQuery desde un DataReader así:
rti::sub::TopicQuery my_topic_query( my_reader, rti::sub::TopicQuerySelection(dds::topic::Filter("x < 10")) );
Luego puede tomar muestras históricas que coincidan con el filtro mientras sigue recibiendo datos en vivo normalmente.
Mirando al futuro
Con C++17 ya aprobado y C++20 en el horizonte, RTI Connext continuará evolucionando la API de C++ con características modernas del lenguaje y mejoras de rendimiento. Manténgase atento o suscríbase al Blog de RTI para las últimas actualizaciones.
Tecnología de Internet de las cosas
- IoT: impulsando el renacimiento digital de la calle principal
- Procesamiento de flujos de tercera generación: Convirtiendo datos IoT en acción en tiempo real
- Por qué el despliegue de 5G se ralentiza: Costes, espectro y desafíos de cobertura
- Computación en el borde: Desbloqueando datos en tiempo real, impulsando eficiencia y generando nuevos ingresos
- G.hn: Impulsando la revolución IoT industrial para conectividad fiable y rentable
- Repensando la manufactura inteligente para la nueva normalidad: Estrategias basadas en datos para la resiliencia
- Datos: El Nuevo Petróleo — Cómo Refinerías Convierten Información Cruda en Valor de Negocio
- El Profesional Híbrido IT/OT: Puentes entre Centros de Datos y Automatización Industrial
- Microsoft Lanza Incubadora de Investigación IA Enfocada en Inteligencia de Propósito General
- Revolucionando la agricultura: cómo IoT impulsa eficiencia y sostenibilidad en la agricultura moderna
- Dominar std::list en C++: Sintaxis, Funciones y Ejemplos Prácticos