Novedades de la API de C ++ moderna
Desde que presentamos la API C ++ moderna para DDS, hemos visto mucho interés por parte de nuestros clientes. Varios de ellos han comenzado a desarrollar nuevos sistemas en C ++ 11. También hemos mejorado constantemente la API y hay algunas funciones nuevas, grandes y pequeñas, de las que quería hablar aquí.
Asignación IDL mejorada a C ++. El generador de código proporciona un mapeo nuevo y mejorado para C ++ moderno. Una nueva opción, -stl , combinado con -language C ++ 03 o -lenguaje C ++ 11 lo habilita.
Esta opción cambia la asignación de los siguientes tipos de IDL:
- Las secuencias ilimitadas se asignan a
std ::vector
(esto requiere -unboundedSupport ) - Las secuencias delimitadas se asignan a
rti ::core ::
secuencia_delimitada. Este tipo es similar a un std ::vector, pero está optimizado para la deserialización de datos. Si minimizar la latencia no es una preocupación principal, o T es simple, puede elegir mapear secuencias limitadas a std ::vector
también con la nueva anotación IDL @use_vector. - Las cadenas y las cadenas anchas se asignan a
std ::string,
ystd ::wstring
respectivamente. - Los miembros con la nueva anotación @external (equivalente a la notación de puntero "*") se asignan al nuevo tipo
dds ::core ::external
similar a, shared_ptr.
Este contenedor proporciona una alternativa más segura a la asignación anterior a un puntero sin formato. Un miembro externo no se puede sobrescribir cuando su memoria se presta desde el middleware (por ejemplo, al leer unLoanedSamples
contenedor).
Por ejemplo, dado el siguiente tipo de IDL:
struct MyType {
secuenciamy_unbounded_seq;
secuenciamy_bounded_seq;
@use_vector sequencemy_other_bounded_seq
string my_str;
@external long my_external;
};
Así es como se ve el tipo de C ++ 11 generado con "-stl"
(Comando completo: rtiddsgen -language C ++ 11 -stl -unboundedSupport MyType.idl )
clase MyType {
público:
Mi tipo();
...
MyType (MyType &&) =predeterminado;
MyType &operator =(MyType &&) =predeterminado;
MyType &operator =(const MyType &) =predeterminado;
MyType (const MyType &) =predeterminado;
std ::vector&my_unbounded_seq () noexcept;
const std ::vector&my_unbounded_seq () const noexcept;
void my_unbounded_seq (const std ::vector&valor);
rti ::core ::secuencia_delimitada&my_seq_delimitado () noexcept;
const rti ::core ::secuencia_delimitada&my_seq_delimitado () const noexcept;
void my_bounded_seq (const rti ::core ::bounded_sequence&valor);
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 ::valor externo);
...
};
API de solicitud-respuesta. La nueva API de solicitud-respuesta para C ++ moderno extiende la API de DDS con dos entidades: rti ::request ::Requester
y rti ::request ::Replier
. Esta API ya estaba disponible en otros lenguajes y ahora está disponible en C ++ moderno como prototipo en 5.3 y lista para producción en 5.3.0.7.
Un ejemplo de código simple está disponible aquí.
Hemos realizado pequeñas mejoras adicionales para facilitar el uso de la API. Por ejemplo, simplificamos cómo usar controladores para enviar condiciones en un WaitSet. Anteriormente, los manejadores tenían que ser functores sin argumentos. Ahora pueden tomar la condición como argumento.
condition.handler ([] () {
// hacer algo
});
// ahora también apoyamos
condition.handler ([] (dds ::core ::cond ::Condición c) {
// haz algo (condición ==c)
});
También hemos mantenido la API actualizada con nuevas funciones de conectividad , como TopicQuery, que presentamos en 5.3. Las consultas de temas proporcionan un mecanismo escalable para que las aplicaciones reciban datos históricos a pedido.
En la API de C ++ moderna, puede crear una instancia de TopicQuery desde un DataReader de la siguiente manera:
rti ::sub ::TopicQuery my_topic_query (
mi_lector,
rti ::sub ::TopicQuerySelection (dds ::tema ::Filtro ("x <10")));
Ahora puede usar my_reader para tomar las muestras de datos históricos de todos los DataWriters coincidentes que pasan el filtro. También puede seguir leyendo datos "en vivo" como de costumbre.
Con C ++ 17 recién aprobado y C ++ 20 a la vuelta de la esquina, continuamos actualizando y modernizando nuestra API de C ++ con características interesantes. ¡Esté atento o simplemente suscríbase al Blog de RTI para conocer las últimas actualizaciones!
Tecnología de Internet de las cosas
- IoT anuncia una nueva era para la calle principal
- La transmisión de datos abre nuevas posibilidades en la era de IoT
- ¿Qué va a detener el lanzamiento de 5G?
- Es hora de cambiar:una nueva era en el límite
- G.hn abre la puerta a nuevas oportunidades industriales
- Repensando la fabricación inteligente para la nueva normalidad
- Si los datos son el aceite nuevo, ¿quién es su refinador?
- El surgimiento de una nueva especie de TI:el profesional híbrido de TI / OT
- ¿Está cerrada la oficina? Microsoft anuncia una nueva incubadora de investigación de IA
- std::list en C++ con ejemplo
- Cómo IoT es beneficioso para la industria agrícola moderna