最新のC ++ APIの新機能
DDS用の最新のC ++ APIを導入して以来、お客様から多くの関心が寄せられています。それらのいくつかは、C ++ 11で新しいシステムの開発を開始しました。また、APIは常に改善されており、ここで話したかった大小の新機能がいくつかあります。
C ++へのIDLマッピングを改善しました。 コードジェネレーターは、最新のC ++への新しい拡張マッピングを提供します。新しいオプション、 -stl 、-言語と組み合わせる C ++ 03 または-言語C ++ 11 有効にします。
このオプションは、次のIDLタイプのマッピングを変更します。
- 無制限のシーケンスは
std ::vector
にマップされます (これには -unboundedSupport が必要です ) - 境界シーケンスは
rti ::core ::
にマップされます bounded_sequence。このタイプはstd ::vectorに似ていますが、データの逆シリアル化用に最適化されています。レイテンシーの最小化が最大の関心事ではない場合、またはTが単純な場合は、境界シーケンスを std ::vector
にマップすることを選択できます。 新しい@use_vectorIDLアノテーションも同様です。 - 文字列と幅の広い文字列は
std ::string、
にマップされます およびstd ::wstring
それぞれ。 - 新しいアノテーション@external(「*」ポインタ表記と同等)を持つメンバーは、新しいタイプ
dds ::core ::external
にマップされます。、 shared_ptr。
に似ています このラッパーは、生のポインターへの以前のマッピングに代わるより安全な方法を提供します。外部メンバーは、そのメモリがミドルウェアから貸し出されている場合(たとえば、LoanedSamples
を読み取る場合)は上書きできません。 コンテナ)。
たとえば、次のIDLタイプがあるとします。
struct MyType {
sequencemy_unbounded_seq;
sequencemy_bounded_seq;
@use_vector sequencemy_other_bounded_seq
文字列my_str;
@external long my_external;
};
これは、生成されたC ++ 11タイプが「-stl」でどのように見えるかです
(フルコマンド: rtiddsgen -language C ++ 11 -stl -unboundedSupport MyType.idl )
class MyType {
公衆:
私のタイプ();
..。
MyType(MyType &&)=デフォルト;
MyType&operator =(MyType &&)=デフォルト;
MyType&operator =(const MyType&)=デフォルト;
MyType(const MyType&)=デフォルト;
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(dds ::core ::externalvalue);
..。
};
リクエスト/リプライAPI。 最新のC ++用の新しい要求/応答APIは、DDSAPIを次の2つのエンティティで拡張します。 rti ::request ::Requester
および rti ::request ::Replier
。このAPIはすでに他の言語で利用可能でしたが、現在5.3ではプロトタイプとして最新のC ++で利用可能であり、5.3.0.7では本番環境に対応しています。
簡単なコード例はここで利用できます。
追加の小さな改善を行いました APIを使いやすくするため。たとえば、WaitSetで条件をディスパッチするためのハンドラーの使用方法を簡略化しました。以前は、ハンドラーは引数のないファンクターである必要がありました。これで、条件を引数として取ることができます。
condition.handler([](){
//何かをする
});
//今はサポートもしています
condition.handler([](dds ::core ::cond ::Condition c){
//何かをする(条件==c)
});
また、新しい接続機能でAPIを最新の状態に保ちました 、5.3で導入したTopicQueryなど。トピッククエリは、アプリケーションが履歴データをオンデマンドで受信するためのスケーラブルなメカニズムを提供します。
最新のC ++ APIでは、次のようにDataReaderからTopicQueryインスタンスを作成できます。
rti ::sub ::TopicQuery my_topic_query(
my_reader、
rti ::sub ::TopicQuerySelection(dds ::topic ::Filter( "x <10")));
これで、my_readerを使用して、フィルターを通過するすべての一致するDataWriterから履歴データサンプルを取得できます。いつものように「ライブ」データを読み続けることもできます。
C ++ 17が承認され、C ++ 20が間もなく登場する中、エキサイティングな機能を備えたC ++ APIの更新と最新化を続けています。最新のアップデートについては、しばらくお待ちいただくか、RTIブログに登録してください。
モノのインターネットテクノロジー