8

インターネット上でこれについて何も見つけることができなかったので、C ++/CXが実装されている方法についての洞察を持っている人を探しています。C ++ / CXに関するウィキペディアの記事では、ランタイムベースのジェネリックをサポートしていると述べていますが、ジェネリック型をインスタンス化するために完全に実装されたヘッダーファイルは必要ないことを意味します。これが.NETでどのように機能するかを理解しています(アセンブリにはILコードが含まれており、JITは具体的な型を挿入して、新しいインスタンス化があるときはいつでもコンパイルできます)が、C ++ / CX(ネイティブにコンパイルされます)では、編集するJITはありません実行時のコード(x86マシンコードではかなり難しいと思います)

では、ここでの秘訣は何ですか、それはボクシングによる型消去ですか、それともいくつかの新しい工夫されたスキームですか?

(型に関するメタデータが.NET形式で保存されていることは知っていますが、メソッドのコードの後に​​あります)

4

2 に答える 2

4

ここでこの記事を見ると、最後の行のジェネリックへの参照は、ジェネリックがインターフェイスとデリゲートを備えたC ++/CXで使用されていることを示しています。

http://msdn.microsoft.com/en-us/library/windows/apps/br212455(v=vs.110).aspx

これは、C ++ / CXコンパイラが実際のオブジェクトのネイティブコード関数をコンパイルし、C++テンプレートと同様の方法でジェネリックインターフェイスを使用できるようにするインターフェイスとして定義されているため意味があります。関数のネイティブコードがコンパイルされ、汎用インターフェイスを使用してさまざまなタイプを操作します。

コンパイラにとって、これはC ++/CLRとC++/CXの違いのようです。/ clr:ジェネリッククラス、インターフェース、デリゲートが許可されます。/ ZW:汎用インターフェースとデリゲートのみ。

ここhttp://msdn.microsoft.com/en-us/library/windows/apps/hh699870(v=vs.110).aspxを見ると、クラスに一般的なルールがないことがわかります。

ただし、このトピックhttp://msdn.microsoft.com/en-us/library/windows/apps/hh755792(v=vs.110).aspxを読むと、ジェネリックがインターフェイスとして適用されていることがわかります。

C ++ / CXの「ジェネリッククラス」は、標準のC++テンプレートを使用して実現されます。インスタンス化またはコンパイラが生成した特定のタイプのジェネリックはメタデータにエクスポートされますが、テンプレート自体にはエクスポートされません。したがって、メタデータからMyClassとMyClassを確認できますが、元のMyClassは表示できません。これは、ジェネリック型としてメタデータにエクスポートされるジェネリックインターフェイスの場合には当てはまりません。

これに関する詳細は、http://en.wikipedia.org/wiki/Windows_Runtimeにあります。

したがって、質問に完全に答えるために、現時点では、メソッドのコードは出力dllまたはexeのプリコンパイルされたネイティブコードであり、実際の非ジェネリッククラスにアタッチされています。ただし、コードはジェネリックインターフェイスを使用してジェネリックに使用できます。したがって、10個の異なるクラスがIMyInterfaceを実装でき、次にタイプIMyInterfaceの変数を使用して、たとえば10個の異なるタイプのインスタンスを操作できます。

したがって、簡単な答えは、C ++/CLRにあるようなC++/CXの完全なジェネリッククラスのようなものはないということです。C ++/CXアプリケーションで同じ効果を得るにはテンプレートを使用してください。C ++ジェネリックが必要な場合は、C ++ / CLIで作成されたdllを使用し、C ++/CXとしてコンパイルされたプログラムからそのコードを処理します。

ノート!さまざまな記事を調べてこれだけ収集しましたが、msdnの記事の中には、変更される可能性があると言っているものもあります。

テンプレートを使用してC++/ CXで汎用インターフェイスを使用することは、おそらく彼らが意図していることです。したがって、MyClassというテンプレートを作成してから、MyInterfaceというジェネリックインターフェイスを実装します。したがって、MyClassテンプレートのインスタンス化を行うと、新しいタイプは自動的にMyInterfaceを実装し、このインターフェイスはどこでも使用できます。したがって、コンパイルされたdllとヘッダーファイルの外部では、他のC ++ / CXモジュールとファイルはヘッダーファイルを必要とせずにMyInterfaceのようなタイプで動作できます。これは、テンプレートのインスタンス化がコンパイルされたdll内にあったためですが、メタデータを使用するc++ファイルはその方法を知っています。 MyInterfaceのメタデータはあるが、MyClassのメタデータはないので、MyInterfaceタイプを作成します。

非常に簡単に言えば、ジェネリッククラスはなく、C ++ / CXのジェネリックインターフェイスとデリゲートサポートは、C ++/CLIのジェネリックのように実際に機能するすべてです。

于 2012-05-17T17:15:30.253 に答える
3

私の知る限り、任意のC ++ /CXGenericsはサポートされていません。C ++ / CXは、C ++テンプレートの特殊化として表示されるwinrtパラメーター化されたインターフェイスを使用できますが、任意のジェネリックをエクスポートすることはできません。

Windows :: Foundation名前空間からパラメーター化されたインターフェイスの特殊化を作成できますが、元のパラメーター化されたインターフェイス(パブリック参照テンプレート)は作成できません。

于 2012-05-17T18:32:44.073 に答える