01.Blogs :
mocchi  

C++ でdelegate っぽいものを作ってみた

ノンマネージな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;
と同じ意味です.

ソースはこちらです.興味のあるかたはどうぞご覧ください.

posted on Monday, March 07, 2005 6:28 AM by mocchi


 
03.UPDATE CALENDAR :
<March 2005>
SunMonTueWedThuFriSat
272812345
6789101112
13141516171819
20212223242526
272829303112
3456789

05.MY LINKS :

07.Subscriptions :

Subscriptions


© Copyright 2005 Microsoft Corporation. All Rights Reserved.
Terms of Use | Privacy Statement | Code of Conduct | Hosted by MaximumASP for Microsoft
WHO-BAR