次の方法で共有


ジェネリック関数 (C++/CLI)

ジェネリック関数は、型パラメーターで宣言された関数です。呼び出された場合、実際の型は型パラメーターの代わりに使用されます。

すべてのプラットフォーム

解説

この機能は、すべてのプラットフォームには適用されません。

Windows ランタイム

解説

この機能は Windows ランタイムではサポートされていません。

ssea4yk6.collapse_all(ja-jp,VS.110).gif要件

コンパイラ オプション: /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++では、クラスまたは構造体のコンストラクターは、ジェネリック型パラメーターと宣言されていない可能性があります。

呼び出されたとき、ジェネリック型パラメーターは実際の型に置き換えられます。実際の型は、テンプレート関数の呼び出しと同様の構文を使用して、山かっこでは明示的に指定される場合があります。型パラメーターなしで呼び出された場合、関数呼び出しで指定されたパラメーターから実際の型を推論しようとします。目的の型引数が使用されたパラメーターから推測できない場合、コンパイラはエラーを報告します。

ssea4yk6.collapse_all(ja-jp,VS.110).gif要件

コンパイラ オプション: /clr

ssea4yk6.collapse_all(ja-jp,VS.110).gif

次のコード例は、ジェネリック関数を示します。

// 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!"));
}

出力

  
  

参照

概念

ランタイム プラットフォームのコンポーネントの拡張機能

その他の技術情報

ジェネリック (C++ コンポーネント拡張)