この文書の現在のバージョンと選択したバージョンの差分を表示します。
cli:delegate [2009/02/03 07:17] admin |
cli:delegate [2013/12/23 09:08] |
||
---|---|---|---|
ライン 1: | ライン 1: | ||
- | {{indexmenu_n>16}} | ||
- | ====== delegate ====== | ||
- | |||
- | delegateはC++の関数ポインタ配列のような機能です。ここではまずC++の関数ポインタ配列の例を示します。 | ||
- | <code cpp> | ||
- | typedef void (*MYFUNC)(int); | ||
- | void func1(int i){ } | ||
- | void func2(int j){ } | ||
- | struct C { | ||
- | static void func3(int k){} | ||
- | }; | ||
- | void callall(MYFUNC f[]) | ||
- | { | ||
- | for ( int i=0 ; i < 3 ; ++i ) | ||
- | { | ||
- | (*f[i])(1); | ||
- | } | ||
- | } | ||
- | int main() | ||
- | { | ||
- | MYFUNC funcs[3]; | ||
- | funcs[0] = &func1; | ||
- | funcs[1] = &func2; | ||
- | funcs[2] = &C::func3; | ||
- | callall(funcs); | ||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | 上記の場合、MYFUNCにはクラスの非staticのメンバ関数や、operator()などが定義されているクラスのインスタンスを設定することはできません。 | ||
- | |||
- | 次に、上記の例をdelegateを使って書くと以下のようになります。 | ||
- | |||
- | <code cpp> | ||
- | using namespace System; | ||
- | delegate void MyDele(int); | ||
- | void func1(int i){} | ||
- | void func2(int j){} | ||
- | ref struct C { | ||
- | static void func3(int k) {} | ||
- | }; | ||
- | ref struct D { | ||
- | void func4(int l) {} | ||
- | }; | ||
- | ref struct F { | ||
- | void operator()(int m) {} | ||
- | }; | ||
- | int main() | ||
- | { | ||
- | MyDele^ dele; | ||
- | dele = gcnew MyDele(&func1); | ||
- | dele += gcnew MyDele(&func2); | ||
- | dele += gcnew MyDele(&C::func3); | ||
- | D^ d = gcnew D; | ||
- | dele += gcnew MyDele(d, &D::func4); | ||
- | F^ f = gcnew F; | ||
- | dele += gcnew MyDele(f, &F::operator()); | ||
- | dele(1); | ||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | この場合、delegateが戻り値がvoidですが、戻り値を持つ場合、最後に呼び出された関数の戻り値が帰ります。 | ||
- | |||
- | * delegateの比較と削除 | ||
- | |||
- | ==でdelegateの比較が行われる場合はハンドルの比較が行われるのではなく、delegateが持っている関数によって比較されます。また-=によってdelegateから削除される場合も関数の比較が行われます。 | ||
- | <code cpp> | ||
- | using namespace System; | ||
- | delegate void MyDele(int); | ||
- | void func1(int i) | ||
- | { | ||
- | Console::WriteLine("func1"); | ||
- | } | ||
- | void func2(int j) | ||
- | { | ||
- | Console::WriteLine("func2"); | ||
- | } | ||
- | int main() | ||
- | { | ||
- | MyDele^ dele; | ||
- | | ||
- | dele += gcnew MyDele(&func1); | ||
- | dele += gcnew MyDele(&func2); | ||
- | MyDele^ dele2 = gcnew MyDele(func1); | ||
- | dele2 += gcnew MyDele(&func2); | ||
- | if ( dele == dele2 ) // 真になる | ||
- | Console::WriteLine("TRUE"); | ||
- | else | ||
- | Console::WriteLine("FALSE"); | ||
- | dele -= gcnew MyDele(&func1); // 削除される | ||
- | dele(1); // func2のみ呼ばれる | ||
- | return 0; | ||
- | } | ||
- | </code> |