ノンマネージなC++でもdelegateが使えると便利なような気がするので,
いろいろ考えて作ってみました.ただし,今回作ったdelegateもどきは,
関数の引数の数が1つという制限があるため,2つ以上の引数を渡したいときは
構造体などを利用する必要があります.使い方はこんな感じです.
#include "delegate.h"
#include <stdio.h>
struct HogeHoge{
int i, j;
};
void func1(HogeHoge hh){
printf("func1 : %d, %d\n", hh.i, hh.j);
}
void func2(HogeHoge hh){
printf("func2 : %d\n", hh.i * hh.j);
}
class Hoge{
int v;
public:
Hoge(int v){
this->v = v;
}
void func3(HogeHoge hh){
printf("Hoge::func3 : %d\n", hh.i * hh.j * v);
}
};
inline HogeHoge CreateHogeHoge(int i, int j){
HogeHoge hh={i,j};
return hh;
}
int main(void){
Delegate<HogeHoge> del;
Hoge hoge(9);
del += Delegate<HogeHoge>::DelegateFunc(func1);
del += Delegate<HogeHoge>::DelegateFunc(func2);
del += Delegate<HogeHoge>::DelegateFunc<Hoge>(&hoge, &Hoge::func3);
del(CreateHogeHoge(1,2));
del(CreateHogeHoge(3,4));
del -= Delegate<HogeHoge>::DelegateFunc(func2);
del(CreateHogeHoge(2,3));
del -= Delegate<HogeHoge>::DelegateFunc<Hoge>(&hoge, &Hoge::func3);
del(CreateHogeHoge(3,5));
getchar();
}
Delegateオブジェクトの関数の引数の型は,Delegate<>の<>の部分で指定します.
上の例ではHogeHoge構造体を引数にとる関数を持つことができるDelegate という
ことになります.
DelegateFunc は,Delegateオブジェクトを作成するための関数です.
たとえば,
del += Delegate<HogeHoge>::DelegateFunc(func2);
は,
Delegate d(func2)
del += d;
と同じ意味です.
ソースはこちらです.興味のあるかたはどうぞご覧ください.