ジェネリック (generic) の比較

C++/CLIとC#では「ジェネリック」と呼び、Javaではそれを日本語に訳して「総称」と呼称しています。

ジェネリック (generic)

ジェネリック型宣言

C++ テンプレート
C++/CLI
generic<typename T> ref class Foo
{
};
C#
class Foo<T>
{
}
Java
class Foo<E>
{
}
※型引数として、C++/CLIとC#ではTemplateの「T」、JavaではElementの「E」が一般的に使用されます。

オブジェクトの生成

C++/CLIやC#では型変数に単純型 (基本型) を使用できるのに対して、Javaでは参照型しか認められません。これはC++/CLIやC#ではint型などの単純型の実態は、System.Int32構造体などのエイリアス (別名) にすぎないためです。

C++/CLI
List<int> foo = new List<int>();
C#
List<int> foo = new List<int>();
Java
List<Integer> foo = new List<Integer>();

テンプレート (template)

テンプレートはC++とC++/CLIのみの機能です。

  • テンプレート … 型の展開は、コンパイル時
  • ジェネリック … 型の展開は、実行時
テンプレートとジェネリックの違い
  テンプレート ジェネリック
算術演算子の呼び出し ×
template C<int i> {}などの非型テンプレート パラメーターの使用 ×
明示的な特殊化 (特定の型のテンプレートのカスタム実装) のサポート ×
部分的な特殊化 (型引数のサブセットのカスタム実装) のサポート ×
型パラメーターのジェネリック型の基本クラスとしての使用 ×
型パラメーターの既定の型への割り当て ×
ジェネリック型パラメーターのそれ自身のジェネリック化 ×
有効でない型パラメーターの使用 ×
C++ テンプレートと C# ジェネリックの違い (C# プログラミング ガイド) | MSDN

クラス テンプレート (汎用クラス)

template<class T> class クラス名
{
}

関数テンプレート (汎用関数)

template<typename T> 戻り値の型 関数名 ( 引数の型 引数名 )
{
}
※旧来のC++ではtypenameではなく、関数テンプレートもclassキーワードを使用していた。[ template<class T> ]

参考

参考書