-
28-10-2019 - |
質問
C ++/CX構文を使用してライブラリを作成し、他のプロジェクトで使用したいと思います。
ご存知のように、平易な古いデータ構造には方法や演算子がないため、行動を提供するために別のクラスで静的な方法を書くなどのことをしなければなりませんでした。
また、このようなコードを書くことはできません:
private:
int _D;
public:
property int& D { int& get() {return _D;}}
または、このプロパティを次のような方法に渡します。
void SampleMethod(int& d);
Windowsランタイムライブラリにこれらの制限がある理由がわかりません。
.libファイルでC ++/CXおよびWindowsランタイム拡張機能をコンパイルするにはどうすればよいですか?または、別のプロジェクトでWRLプロジェクト全体のコードファイル全体を事前コンパイルするにはどうすればよいですか?
解決
WinRTは、少なくともC ++、C#、VB、JS - 言語的使用を目的としたABIです。このため、それが提供するコンストラクトは、それらの言語で表現できるものに制限されています。たとえば、参照ごとに戻る場合、C#コードはそれをどのように使用しますか?
C ++からのみ消費するためにC ++で静的ライブラリを作成したい場合、私のアドバイスは、できるだけ言語拡張機能を避け、WinRTオブジェクトを渡す必要がある場所のためにのみそれらを保持することです。そのシナリオで完全なC ++/CXに進むことから導き出す利点はありません。
他のヒント
「構造体」が基本的に「すべてのメンバーが公開されているクラス」であるC ++とは異なり、Windowsランタイムでは、「struct」は値タイプです。そのため、プロパティアクセサーズを含む方法はありません(値タイプにはメソッドがありません)。
さらに、構造体は値タイプであるため、常に価値によって渡されます。これは、構造体をメソッドに渡すには、構造体の内容をコピーする必要があることを意味します(値型は、すべての消費者がデータ型の独自のコピーで動作することを意味します)。この結果、構造体のサイズはかなり小さくなければなりません(「16バイト未満」と考えてください)。
より大きなオブジェクトを渡す必要がある場合は、代わりにクラスを使用します - クラスは参照によって渡されるため、データを任意の量のデータを保持できます。