次の方法で共有


C++ テンプレートと C# ジェネリックの違い (C# プログラミング ガイド)

C# ジェネリックテンプレートと C++ テンプレートは、どちらもパラメーター化された型のサポートを提供する言語機能です。 ただし、この 2 つの違いは多数あります。 構文レベルでは、C# ジェネリックは、C++ テンプレートを複雑にすることなく、パラメーター化された型に対するより簡単なアプローチです。 さらに、C# では、C++ テンプレートが提供するすべての機能を提供しようとはしません。 実装レベルでは、主な違いは、C# ジェネリック型の置換が実行時に実行され、それによってインスタンス化されたオブジェクトに対してジェネリック型情報が保持される点です。 詳細については、「 ランタイムのジェネリック」を参照してください。

C# ジェネリックと C++ テンプレートの主な違いを次に示します。

  • C# ジェネリックは、C++ テンプレートと同じ柔軟性を提供しません。 たとえば、C# ジェネリック クラスで算術演算子を呼び出すことはできませんが、ユーザー定義演算子を呼び出す可能性があります。

  • C# では、 template C<int i> {}など、型以外のテンプレート パラメーターは許可されません。

  • C# は明示的な特殊化をサポートしていません。つまり、特定の型のテンプレートのカスタム実装です。

  • C# では、部分特殊化はサポートされていません。型引数のサブセットのカスタム実装です。

  • C# では、ジェネリック型の基底クラスとして型パラメーターを使用することはできません。

  • C# では、型パラメーターに既定の型を指定することはできません。

  • C# では、ジェネリック型パラメーター自体をジェネリックにすることはできませんが、構築された型はジェネリックとして使用できます。 C++ では、テンプレート パラメーターを使用できます。

  • C++ では、テンプレート内のすべての型パラメーターに対して有効ではない可能性があるコードが許可され、その後、型パラメーターとして使用される特定の型がチェックされます。 C# では、クラス内のコードを、制約を満たす任意の型で動作するように記述する必要があります。 たとえば、C++ では、型パラメーターのオブジェクトに対して算術演算子 + および - を使用する関数を記述できます。これにより、これらの演算子をサポートしていない型を持つテンプレートのインスタンス化時にエラーが発生します。 C# ではこれを禁止します。使用できる言語コンストラクトは、制約から推測できる言語コンストラクトだけです。

こちらも参照ください