ジェネリック関数 (C++/CLI)
ジェネリック関数は、型パラメーターで宣言される関数です。 呼び出されると、型パラメーターではなく実際の型が使用されます。
すべてのプラットフォーム
解説
この機能は、すべてのプラットフォームには適用されません。
Windows ランタイム
解説
Windows ランタイムでは、この機能はサポートされていません。
要件
該当なし。
共通言語ランタイム
ジェネリック関数は、ジェネリック型パラメーターを使用して宣言される関数です。 呼び出されると、型パラメーターではなく実際の型が使用されます。
構文
generic-declaration
:
generic
<
generic-parameter-list
>
optconstraint-clause-list
function-definition
generic-parameter-list
:
generic-parameter
generic-parameter-list
,
generic-parameter
generic-parameter
:
attributes
opt class
identifier
attributes
opt typename
identifier
constraint-clause-list
:
constraint-clause-list
opt constraint-clause
constraint-clause
:
where
identifier
:
constraint-item-list
constraint-item-list
:
constraint-item
constraint-item-list
,
constraint-item
constraint-item
:
type-id
ref class
ref struct
value class
value struct
gcnew ( )
generic-id
:
generic-name
<
generic-argument-list
>
generic-name
:
identifier
operator-function-id
generic-argument-list
:
generic-argument
generic-argument-list
,
generic-argument
generic-argument
:
type-id
パラメーター
generic-parameter-list
必要に応じて属性付きジェネリック型パラメーター識別子のコンマ区切りのリスト。
attributes
(省略可能)追加の宣言型情報。 属性と属性クラスについては、属性を参照してください。
constraint-clause-list
この省略可能なリストでは、型引数として使用できる型の制限を指定します。 ジェネリック型パラメーター (C++/CLI) の Constraints で指定された形式を受け取ります。
function-definition
メソッドまたはスタンドアロン関数の定義。 関数に virtual
修飾子がない可能性があります。これは、仮想メソッドがジェネリックではない可能性があるため、許可されません。 関数の本体は、ジェネリック型パラメーター識別子を参照できます。 この関数は、 operator
関数である場合があります。
generic-id
ジェネリック関数のインスタンスを呼び出すときに、 generic-argument-list
で実装するために使用する型を指定します。 この一覧は generic-parameter-list
に対応しており、オプションの constraint-clause-list
の制約を満たす必要があります。
generic-name
ジェネリック関数は、名前として identifier
を持つ場合と、 operator
関数である場合があります。
解説
ジェネリック関数は、1 つ以上のジェネリック型パラメーターで宣言された関数です。 class
または struct
のメソッド、またはスタンドアロン関数が可能です。 単一のジェネリック宣言は、ジェネリック型パラメーターに置換される実際の型だけが異なる関数ファミリを暗黙的に宣言します。
class
または struct
のコンストラクターは、ジェネリック型パラメーターで宣言できません。
呼び出されると、ジェネリック型パラメーターは、実際の型に置換されます。 実際の型は、関数テンプレート呼び出しと同様の構文を使用して、山かっこで明示的に指定できます。 型パラメーターなしで呼び出すと、コンパイラは、関数呼び出しで提供されたパラメーターから実際の型を推測しようとします。 使用されるパラメーターから目的の型引数を推定できない場合、コンパイラはエラーを報告します。
要件
コンパイラ オプション: /clr
例
次のコード例では、ジェネリック関数を示します。
// generics_generic_function_1.cpp
// compile with: /clr
generic <typename ItemType>
void G(int i) {}
ref struct A {
generic <typename ItemType>
void G(ItemType) {}
generic <typename ItemType>
static void H(int i) {}
};
int main() {
A myObject;
// generic function call
myObject.G<int>(10);
// generic function call with type parameters deduced
myObject.G(10);
// static generic function call
A::H<int>(10);
// global generic function call
G<int>(10);
}
ジェネリック関数は、関数の署名または arity (型パラメーターの数) に基づいてオーバー ロードできます。 また、ジェネリック関数は、いくつかの型パラメーターが異なっている限り、同じ名前の非ジェネリック関数でオーバー ロードできます。 たとえば、次の関数をオーバー ロードできます。
// generics_generic_function_2.cpp
// compile with: /clr /c
ref struct MyClass {
void MyMythod(int i) {}
generic <class T>
void MyMythod(int i) {}
generic <class T, class V>
void MyMythod(int i) {}
};
次の例では、ジェネリック関数を使用して、配列内の最初の要素を検索します。 MyClass
を宣言し、基底クラス MyBaseClass
から継承します。 MyClass
には、基底クラス内の別のジェネリック関数 MyBaseClassFunction
を呼び出すジェネリック関数 MyFunction
が含まれます。 main
で、別の型引数を使用して、ジェネリック関数 MyFunction
が呼び出されます。
// generics_generic_function_3.cpp
// compile with: /clr
using namespace System;
ref class MyBaseClass {
protected:
generic <class ItemType>
ItemType MyBaseClassFunction(ItemType item) {
return item;
}
};
ref class MyClass: public MyBaseClass {
public:
generic <class ItemType>
ItemType MyFunction(ItemType item) {
return MyBaseClass::MyBaseClassFunction<ItemType>(item);
}
};
int main() {
MyClass^ myObj = gcnew MyClass();
// Call MyFunction using an int.
Console::WriteLine("My function returned an int: {0}",
myObj->MyFunction<int>(2003));
// Call MyFunction using a string.
Console::WriteLine("My function returned a string: {0}",
myObj->MyFunction<String^>("Hello generic functions!"));
}
My function returned an int: 2003
My function returned a string: Hello generic functions!