STL/CLR の仕組み
επιστημη氏が STL/CLR ネタを書かれています.
- STL/CLR @Orcas CTP Sep2006
- STL/CLR first impression
- STL/CLR second impression
- std::container ⇔ cliext::container
- System::Collections::Generic::container ⇔ cliext::container
generics と template の違い
よく generics と template は似ていると言われますが,細部に宿る本質は全くの別物で,その一例を (id:NyaRuRu:20060731#p1) でも紹介しました.
C++ の template は,C# の文脈で言えば partial クラスによるコンパイル時合成処理とよく似ています.
「template では可能だが generics ではできないこと」のいくつかは,「partial クラスでは可能だが,generics クラスではできないこと」として説明することができます.
cliext containers
cliext 名前空間直下に定義されたコンテナクラスは,generics ではなく template を使用しており,コンパイル時に型引数 T を用いてクラス定義が作成されます.例えば,2 つの C++/CLI プロジェクトでそれぞれ cliext::vector
このような事情を反映してか,コンパイル時に生成された cliext::vector
cliext generic enumerators, cliext generic iterators
cliext に定義された template container class は,アセンブリごとに実装クラスを生成し,かつアセンブリ間で互換性がないという discomunication を引き起こします.では,STL/CLR を用いて作られたクラスを異なるアセンブリや異なる言語で連携させるにはどうすればいいのでしょうか?
その鍵となるのが Microsoft.VisualC.STLCLR.dll に定義された generic class / interface です.
STL/CLR のコンテナクラスは Microsoft.VisualC.STLCLR.dll に定義された generic interface を実装しています.例えば cliext::vector
同様に,cliext::vector
また,C++ の Iterator パターンを表す,cliext::IForwardIterator