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) 停電にびくびくしながら書いてます。無事書き終われるでしょうか…
...
# 何とか無事に書き終われたようです ホッ…
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) 停電にびくびくしながら書いてます。無事書き終われるでしょうか…
...
# 何とか無事に書き終われたようです ホッ…