C++版デリゲート作ってみました

C#などではおなじみのデリゲートと同じようなことができるC++のクラスを作ってみました。
boost:function と同じような機能ですが、boostはサイズが結構大きくて、デリゲートが欲しい
だけのためにboost一式をインストールするにはちょっと抵抗があったので、じゃあ作ってしまえ、と^^;


デリゲートのインスタンス1個に入れられるのは、以下の三種類のうちの一つです。
(1) 関数ポインタ
(2) メンバ関数ポインタ+そのクラスのインスタンス
(3) 関数オブジェクトのポインタ
1つのデリゲートオブジェクトにこの3つのうちのどれか1つだけを入れることができます。
このデリゲート自体にはマルチキャストの機能はありませんが、関数の型さえあっていれば、
同じ型のデリゲートにこれら3つを混在させることができますので、
std::vectorなどに格納してイテレーションなどをすることでマルチキャストを再現できます。
関数の引数の数は0個から3個までサポートしました。
ライセンスは zlib ライセンスとします。
ダウンロードはコチラ https://osdn.net/downloads/users/23/23649/umdelegate.h

使い方の例

#include <vector>
#include "umdelegate.h"
using namespace umdelegate;
class Hoge{
public:
 int test1(float f){ /* 処理 */; return 1;}
 short operator ()(double d, double e, int f){
  /* 処理 */
  return 50;
 }
};

void test(int i, double j){
 //処理
}

int test2(float f){ /* 処理 */; return 1;}
int main(void){
 // 戻り値 int 第一引数 float
 typedef delegate1<int, float> delegate1if_type;
 Hoge h1;
 delegate1 d1(&h1, &h1::test1), d2(&test2);
 // 関数ポインタ 戻り値 void、第一引数 int、第一引数 int
 delegate2 <void, int, double> d3(&test);
 delegate3 <short, double, double, int> d4(&h1); // d4は関数オブジェクト
 std::vector<delegate1> vect;
 // d1にはメンバ関数ポインタ、d2にはただの関数ポインタがそれぞれ
 // 入っているが、デリゲートの型が同じなので同じコンテナに入れることができる
 // これを利用することでマルチキャストが実現できます
 vect.push_back(d1);
 vect.push_back(d2);
 d4(10.0, 20.3, 5);

}

履歴:
○バージョンアップ(比較演算子を実装)しました。ついでに、ライセンスも変更しました。zlibライセンスです。(参考日本語訳: http://www.opensource.jp/licenses/zlib-license.html)
○2006/04/27: 1.20 にバージョンアップしました。
 ・デフォルトコンストラクタを実装しました。
 ・マルチキャストのためのヘルパ関数を用意しました。


# 雷こわいよー(TT) 停電にびくびくしながら書いてます。無事書き終われるでしょうか…
...
# 何とか無事に書き終われたようです ホッ…