O que há de novo na API C ++ moderna
Desde que introduzimos a API C ++ moderna para DDS, vimos muito interesse de nossos clientes. Vários deles começaram a desenvolver novos sistemas em C ++ 11. Também aprimoramos constantemente a API e há alguns novos recursos, grandes e pequenos, sobre os quais gostaria de falar aqui.
Mapeamento IDL aprimorado para C ++. O Code Generator fornece um mapeamento novo e aprimorado para o C ++ moderno. Uma nova opção, -stl , combinado com -language C ++ 03 ou -language C ++ 11 permite isso.
Esta opção altera o mapeamento dos seguintes tipos de IDL:
- Sequências ilimitadas mapeiam para
std ::vector
(isso requer -unboundedSupport ) - As sequências limitadas são mapeadas para
rti ::core ::
bounded_sequence. Este tipo é semelhante a um std ::vector, mas é otimizado para desserialização de dados. Se minimizar a latência não for uma preocupação principal, ou T for simples, você pode escolher mapear sequências limitadas para std ::vector
bem como com a nova anotação @use_vector IDL. - Strings e strings largas mapeiam para
std ::string,
estd ::wstring
respectivamente. - Membros com a nova anotação @external (equivalente à notação de ponteiro “*”) mapeiam para o novo tipo
dds ::core ::external
semelhante a, shared_ptr.
Este wrapper fornece uma alternativa mais segura ao mapeamento anterior para um ponteiro bruto. Um membro externo não pode ser sobrescrito quando sua memória é emprestada do middleware (por exemplo, ao ler umLoanedSamples
recipiente).
Por exemplo, dado o seguinte tipo de IDL:
struct MyType {
sequênciamy_unbounded_seq;
sequênciamy_bounded_seq;
@use_vector sequencemy_other_bounded_seq
string my_str;
@external long my_external;
};
É assim que o tipo C ++ 11 gerado se parece com “-stl”
(Comando completo: rtiddsgen -language C ++ 11 -stl -unboundedSupport MyType.idl )
class MyType {
público:
Meu tipo();
...
MyType (MyType &&) =default;
MyType &operator =(MyType &&) =default;
MyType &operator =(const MyType &) =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&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 (valor dds ::core ::external);
...
};
API de solicitação de resposta. A nova API de solicitação-resposta para C ++ moderno estende a API DDS com duas entidades:
rti ::request ::Requester
e rti ::request ::Replier
. Esta API já estava disponível em outras linguagens e agora está disponível em C ++ moderno como um protótipo no 5.3 e pronto para produção no 5.3.0.7. Um exemplo de código simples está disponível aqui.
Fizemos pequenas melhorias adicionais para tornar a API mais fácil de usar. Por exemplo, simplificamos como usar manipuladores para despachar Condições em um WaitSet. Anteriormente, os manipuladores precisavam ser functores sem argumento. Agora eles podem tomar a Condição como um argumento.
condition.handler ([] () {
// faça alguma coisa
});
// agora também apoiamos
condition.handler ([] (dds ::core ::cond ::Condition c) {
// faça algo (condição ==c)
});
Também mantivemos a API atualizada com novos recursos de conectividade , como TopicQuery, que apresentamos em 5.3. As consultas de tópicos fornecem um mecanismo escalonável para que os aplicativos recebam dados históricos sob demanda.
Na API C ++ moderna, você pode criar uma instância TopicQuery a partir de um DataReader da seguinte maneira:
rti ::sub ::TopicQuery my_topic_query (
my_reader,
rti ::sub ::TopicQuerySelection (dds ::topic ::Filter ("x <10")));
Agora você pode usar my_reader para obter as amostras de dados históricos de todos os DataWriters correspondentes que passam pelo filtro. Você também pode continuar lendo dados “ao vivo” como de costume.
Com o C ++ 17 recém-aprovado e o C ++ 20 chegando, continuamos atualizando e modernizando nossa API C ++ com recursos interessantes. Fique ligado ou simplesmente assine o RTI Blog para obter as últimas atualizações!
Tecnologia da Internet das Coisas
- A IoT anuncia uma nova era para a rua
- O streaming de dados abre novas possibilidades na era IoT
- O que vai parar o lançamento 5G?
- É hora de mudar:uma nova era no limite
- G.hn está abrindo a porta para novas oportunidades industriais
- Repensando a Manufatura Inteligente para o Novo Normal
- Se data for o novo óleo, quem é o seu refinador?
- O surgimento de uma nova espécie de TI:O profissional híbrido de TI / OT
- O Escritório está fechado? Microsoft anuncia nova incubadora de pesquisa de IA
- std::list em C++ com exemplo