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

C# ジェネリックと C++ テンプレートのいずれも、パラメーター化された型のサポートを提供する言語機能です。C# Generics and C++ templates are both language features that provide support for parameterized types. ただし、これら 2 つにはさまざまな違いがあります。However, there are many differences between the two. 構文レベルでは、C# ジェネリックの場合、パラメーター化された型の取り扱いが単純であり、C++ テンプレートのような複雑さがありません。At the syntax level, C# generics are a simpler approach to parameterized types without the complexity of C++ templates. さらに、C++ テンプレートで提供されるすべての機能が、C# でも提供されるわけではありません。In addition, C# does not attempt to provide all of the functionality that C++ templates provide. 実装レベルでは、C# ジェネリック型の代入は実行時に行われ、その結果、インスタンス化されたオブジェクトのジェネリック型情報が保存されるという点が最も大きな違いです。At the implementation level, the primary difference is that C# generic type substitutions are performed at runtime and generic type information is thereby preserved for instantiated objects. 詳細については、「ランタイムのジェネリック」を参照してください。For more information, see Generics in the Run Time.

C# ジェネリックと C++ テンプレートの主な違いを以下に示します。The following are the key differences between C# Generics and C++ templates:

  • C# ジェネリックは、C++ テンプレートほど柔軟ではありません。C# generics do not provide the same amount of flexibility as C++ templates. たとえば、C# ジェネリック クラスでは、ユーザー定義演算子は呼び出すことができますが、算術演算子を呼び出すことはできません。For example, it is not possible to call arithmetic operators in a C# generic class, although it is possible to call user defined operators.

  • C# では、template C<int i> {} などの非型テンプレート パラメーターを使用できません。C# does not allow non-type template parameters, such as template C<int i> {}.

  • C# は、明示的な特殊化 (特定の型のテンプレートのカスタム実装) をサポートしません。C# does not support explicit specialization; that is, a custom implementation of a template for a specific type.

  • C# は、部分的な特殊化 (型引数のサブセットのカスタム実装) をサポートしません。C# does not support partial specialization: a custom implementation for a subset of the type arguments.

  • C# では、型パラメーターをジェネリック型の基底クラスとして使用できません。C# does not allow the type parameter to be used as the base class for the generic type.

  • C# では、型パラメーターに既定の型を割り当てることができません。C# does not allow type parameters to have default types.

  • C# では、構築された型はジェネリックとして使用できますが、ジェネリック型パラメーター自体はジェネリックにできません。In C#, a generic type parameter cannot itself be a generic, although constructed types can be used as generics. C++ では、テンプレート パラメーターを使用できます。C++ does allow template parameters.

  • C++ では、テンプレート内のすべての型パラメーターに対して有効でない可能性のあるコードを使用できます。このようなコードは、型パラメーターとして使用されている特定の型に対してチェックされます。C++ allows code that might not be valid for all type parameters in the template, which is then checked for the specific type used as the type parameter. C# では、制約を満たすすべての型で正常に動作するようにクラスのコードを記述する必要があります。C# requires code in a class to be written in such a way that it will work with any type that satisfies the constraints. たとえば、C++ では、型パラメーターのオブジェクトで算術演算子 + および - を使用し、これらの演算子をサポートしない型を使ってテンプレートをインスタンス化するとエラーを生成する関数を記述できます。For example, in C++ it is possible to write a function that uses the arithmetic operators + and - on objects of the type parameter, which will produce an error at the time of instantiation of the template with a type that does not support these operators. C# では、このような関数は許可されません。許可される言語構成要素は、制約から推定できるものだけに限られます。C# disallows this; the only language constructs allowed are those that can be deduced from the constraints.

関連項目See also