テンプレートとジェネリクス

 今頃になってようやく違いが分かる男になれました。
 アセンブリ境界の問題ですね。

 テンプレートはコンパイル時に型が確定するので、例えば、アセンブリを作った場合、そのアセンブリ中で使用されたテンプレート型以外が利用できないわけです。

 例えば、アセンブリ A にテンプレート型を作ったとして、

template
public class Clazz
{
public:
    Clazz(T var)
    {
        this->value = var;
    }

private:
    T value;
};

 これをコンパイルしても、アセンブリ中にはクラス Clazz は生成されません(使われないから)。
 アセンブリ内部でこれを使っていると、使っている型に対して明示的に特殊化されて、

    Clazz clz(L"ヽ(゜∀。)ノ");

 これによって、public 宣言されているので、アセンブリ外には Clazz 型のみが提供されるようになります。

 Generics の場合、型が確定するのは実行時になるので、アセンブリ中には型確定前の開いた生成型が用意されます。これが実行時に型にアタッチされて閉じた生成型になり、インスタンス化されることになるわけです。

 テンプレートはアセンブリ内でのみ使うか、main を持つ実行モジュールのヘッダとして定義することになり、結果として実行時型決定するジェネリクスに比べて C++/CLI では適用範囲が狭くなってしまうわけです。

 納得、納得。