次の方法で共有


delegate (C++ コンポーネント拡張)

関数ポインターを表す型を宣言します。

すべてのランタイム

デリゲートは、Windows ランタイムと共通言語ランタイムの両方でサポートされます。

解説

delegate は状況依存のキーワードです。 詳細については、「状況依存のキーワード (C++ コンポーネント拡張)」を参照してください。

型がデリゲートかどうかをコンパイル時に検出するには、__is_delegate() 型の特徴を使用します。 詳細については、「型の特徴のコンパイラ サポート (C++ コンポーネント拡張)」を参照してください。

Windows ランタイム

C++/CX は、次の構文のデリゲートをサポートします。

構文

access delegate return-type delegate-type-identifier ([ parameters ])

パラメーター

  • access
    (省略可能) デリゲートのアクセシビリティ。public (既定値) または private を使用できます。 関数のプロトタイプは、const または volatile のキーワードで修飾することができます。

  • return-type
    関数のプロトタイプの戻り値の型。

  • delegate-type-identifier
    宣言されたデリゲート型の名前。

  • parameters
    (省略可能) 関数プロトタイプの型と識別子。

解説

デリゲートと同じプロトタイプでイベントを宣言するには、delegate-type-identifier を使用します。 詳細については、「Delegates (C++/CX) (デリゲート (C++/CX))」を参照してください。

要件

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

共通言語ランタイム

共通言語ランタイムは、次の構文のデリゲートをサポートします。

構文

access delegate function_declaration

パラメーター

  • access
    (省略可能) アセンブリの外部のデリゲートのアクセシビリティとして、public または private を使用できます。既定は private です。クラス内で、デリゲートは任意のアクセシビリティを持つことができます。

  • function_declaration
    デリゲートにバインドできる関数のシグネチャ。 デリゲートの戻り値の型は、任意のマネージ型です。 相互運用性の理由により、デリゲートの戻り値の型を CLS 型とすることをお勧めします。

    非バインドのデリゲートを定義するには、function_declaration の最初のパラメーターでは、オブジェクトの this のポインターの型。 詳細については、「自由なデリゲート」を参照してください。

解説

デリゲートはマルチキャストです。"関数ポインター" は、マネージ クラス内の 1 つ以上のメソッドに関連付けることができます。 delegate キーワードは、特定のメソッド シグネチャを持つマルチキャスト デリゲート型を定義します。

また、デリゲートは、静的メソッドなどの値クラスのメソッドにもバインドできます。

デリゲートには次の特徴があります。

  • System::MulticastDelegate から継承します。

  • コンストラクターは、マネージ クラスまたは NULL へのポインター (静的メソッドへのバインドの場合) と指定した型の完全修飾メソッドの 2 つの引数を受け取ります。

  • Invoke というメソッドを持ち、そのシグネチャはデリゲートの宣言されたシグネチャと一致します。

デリゲートが呼び出されると、関数がアタッチされた順に呼び出されます。

デリゲートの戻り値は、最後にアタッチされたメンバー関数の戻り値です。

デリゲートはオーバーロードできません。

デリゲートには、バインドされたデリゲートとバインドされていないデリゲートがあります。

バインドされたデリゲートをインスタンス化する場合、最初の引数はオブジェクトの参照である必要があります。デリゲートのインスタンス化の 2 番目の引数は、マネージ クラス オブジェクトのメソッドのアドレスか、または値型のメソッドへのポインターである必要があります。デリゲートのインスタンス化の 2 番目の引数では、完全なクラス スコープ構文のメソッドを指定し、address-of 演算子を適用する必要があります。

バインドされていないデリゲートをインスタンス化する場合、最初の引数は、マネージ クラス オブジェクトのメソッドのアドレスか、または値型のメソッドへのポインターである必要があります。この引数では、完全なクラス スコープ構文のメソッドを指定し、address-of 演算子を適用する必要があります。

静的またはグローバル関数へのデリゲートを作成する場合に必要なパラメーターは、関数の 1 つだけです (必要に応じて、関数のアドレスを指定します)。

デリゲートの詳細については、以下のトピックを参照してください。

要件

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

デリゲートを宣言、初期化、および呼び出す方法を次の例に示します。

// mcppv2_delegate.cpp
// compile with: /clr
using namespace System;

// declare a delegate
public delegate void MyDel(int i);

ref class A {
public:
   void func1(int i) {
      Console::WriteLine("in func1 {0}", i);
   }

   void func2(int i) {
      Console::WriteLine("in func2 {0}", i);
   }

   static void func3(int i) {
      Console::WriteLine("in static func3 {0}", i);
   }
};

int main () {
   A ^ a = gcnew A;

   // declare a delegate instance
   MyDel^ DelInst;

   // test if delegate is initialized
   if (DelInst)
      DelInst(7);
   
   // assigning to delegate
   DelInst = gcnew MyDel(a, &A::func1);

   // invoke delegate
   if (DelInst)
      DelInst(8);

   // add a function
   DelInst += gcnew MyDel(a, &A::func2);

   DelInst(9);

   // remove a function
   DelInst -= gcnew MyDel(a, &A::func1);

   // invoke delegate with Invoke
   DelInst->Invoke(10);

   // make delegate to static function
   MyDel ^ StaticDelInst = gcnew MyDel(&A::func3);
   StaticDelInst(11);
}

出力

  
  
  
  
  

参照

概念

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