C++ のメンバ関数ポインタは, 特定のクラスのメンバ関数を指すことができる.
しかし, メンバ関数ポインタとメンバ関数の間で, 戻り値型および引数型が一致している必要があるだけではなく, さらにメンバ関数が属するクラスの型にも制限をうける.
クラスは継承できるので必ずしもクラスの型は一致していなくても構わない.
なんとも不自由でづらい制約だ.
一方, デリゲートは, クラスの型には制限を受けない.
デリゲートとメンバ関数の間で, 戻り値型および引数型が一致していればどんなクラスのメンバ関数でもさすことができる.
デリゲートを介すると, まったく関係がないクラスのメンバ関数を呼び出すことができる.
イベントハンドラやスレッド関数, コールバック関数などを書くときに便利だ.
delegate.d
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import std.stdio;
class A{
this(){
writeln("this is constructor");
}
~this(){
writeln("this is destructor");
}
void sayHello(){
writeln("hello");
}
void sayGoodBye(string name){
writeln("goodbye ", name);
}
}
void main(){
A x = new A;
void delegate() hello = &x.sayHello;
void delegate(string) bye = &x.sayGoodBye;
hello();
bye("hanu");
}
|
delegate.d の実行結果は:
[cactus:~/code_d/d_tuts]% ./delegate
this is constructor
hello
goodbye hanu
this is destructor