ジェネリック関数 (C++/CLI)
ジェネリック関数は、型パラメーターで宣言された関数です。呼び出された場合、実際の型は型パラメーターの代わりに使用されます。
すべてのプラットフォーム
解説
この機能は、すべてのプラットフォームには適用されません。
Windows ランタイム
解説
この機能は Windows ランタイムではサポートされていません。
要件
コンパイラ オプション: /ZW
共通言語ランタイム
ジェネリック関数は、型パラメーターで宣言された関数です。呼び出された場合、実際の型は型パラメーターの代わりに使用されます。
構文
[attributes] [modifiers]
return-type identifier <type-parameter identifier(s)>
[type-parameter-constraints clauses]
([formal-parameters])
{
function-body
}
パラメーター
属性 (省略可能)
追加の宣言情報。属性と属性クラスの詳細については、 " " を参照してください。修飾子 (省略可能)
atic stなどの関数の修飾子。 virtual は仮想メソッドがジェネリックではない場合があるため、使用できません。戻り値の型
メソッドによって返される型。戻り値の型が void の場合、戻り値は必要ではありません。identifier
関数名。型パラメーター識別子
カンマ識別区切りのリスト。正式なパラメーター (省略可能)
パラメーター リスト。型パラメーターの制約句
これは、型引数として使用できる指定し ジェネリック型パラメーターの制約 (C++/CLI)で指定された書式を使用します。型に制限が。関数本体
型パラメーターの ID を示す可能性のあるメソッドの本体。
解説
ジェネリック関数またはジェネリック型パラメーターで宣言された関数です。これらは、クラスまたは構造体のメソッド、またはスタンドアロン関数である可能性があります。単一のジェネリック宣言は暗黙的にジェネリック型パラメーターの実際の型の代替でのみが異なるファミリの関数を宣言します。
Visual C++では、クラスまたは構造体のコンストラクターは、ジェネリック型パラメーターと宣言されていない可能性があります。
呼び出されたとき、ジェネリック型パラメーターは実際の型に置き換えられます。実際の型は、テンプレート関数の呼び出しと同様の構文を使用して、山かっこでは明示的に指定される場合があります。型パラメーターなしで呼び出された場合、関数呼び出しで指定されたパラメーターから実際の型を推論しようとします。目的の型引数が使用されたパラメーターから推測できない場合、コンパイラはエラーを報告します。
要件
コンパイラ オプション: /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);
}
例
ジェネリック関数を定義するアリティの関数の数の型パラメーターに基づいてオーバーロードできます。また、ジェネリック関数は、同じ名前の非ジェネリック関数と関数がある型パラメーターで異なる限りオーバーロードできます。たとえば、次の関数はオーバーロードできます。:
// 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) {}
};
例
次の例では、配列の最初の要素を検索のジェネリック関数を使用します。基本クラス MyBaseClassから継承する場合は MyClassを宣言します。MyClass は、別のジェネリック関数をダイヤルするジェネリック関数、 MyFunctionの、基本クラス内の MyBaseClassFunction含まれています。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!"));
}
出力