テンプレートとジェネリクス
今頃になってようやく違いが分かる男になれました。
アセンブリ境界の問題ですね。
テンプレートはコンパイル時に型が確定するので、例えば、アセンブリを作った場合、そのアセンブリ中で使用されたテンプレート型以外が利用できないわけです。
例えば、アセンブリ A にテンプレート型を作ったとして、
templatepublic class Clazz { public: Clazz(T var) { this->value = var; } private: T value; };
これをコンパイルしても、アセンブリ中にはクラス Clazz は生成されません(使われないから)。
アセンブリ内部でこれを使っていると、使っている型に対して明示的に特殊化されて、
Clazzclz(L"ヽ(゜∀。)ノ");
これによって、public 宣言されているので、アセンブリ外には Clazz
Generics の場合、型が確定するのは実行時になるので、アセンブリ中には型確定前の開いた生成型が用意されます。これが実行時に型にアタッチされて閉じた生成型になり、インスタンス化されることになるわけです。
テンプレートはアセンブリ内でのみ使うか、main を持つ実行モジュールのヘッダとして定義することになり、結果として実行時型決定するジェネリクスに比べて C++/CLI では適用範囲が狭くなってしまうわけです。
納得、納得。