閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

delegate

public delegate void print();

void hoge_print() { Console::WriteLine("hoge"); }
void hige_print() { Console::WriteLine("hige"); }

int main(array ^args)
{
  {
    print^ p = gcnew print(&hoge_print);
    p += gcnew print(&hige_print); // !
    p->Invoke(); // ここで実行
  }

  {
    print^ p;
    {
      print^ a = gcnew print(&hoge_print);
      print^ b = gcnew print(&hige_print);
      p = a + b; // !!
    }
    p->Invoke();
  }

  return 0;
}

なんだか知ってはいけない世界を知ってしまった気がします。随分前に仕事で C# を一瞬触った時にデリゲータ自体は見知っていたのですが、当時は C でも関数ポインタ使えば再現できるねとか思っていたんですが……。まあ C++ なら std::vector とか使えば、まねっこは (多分) できますが、これだけ手軽にできるというのは強力ですね。

ああ、そうか、 C++ でも operator+() と operator-() をオーバーライドした、関数ポインタの配列を内部に持っておくクラスを作れば同じようなことはできるのか。 delegete は System::MluticastDelegate を使って実現しているようなので、仕組みも大して変わらないのか。

C# だと匿名メソッドを組み合わせてさらに自由度の高いことができますが、 C++ ではそこまではできないのかな。