[C++] C++でC#っぽいdelegateを実装してみる(boost.signals2を使う)
C#のdelegateをC++で実現できないかと考え、こちらの記事にその方法を書きました。
上記を実現するために、C++でC#っぽく使えるDelegateクラスを実装しました。
しかし、boost.signals2でほぼ同様のことができることを知りました。
以下にそのboost.signals2を用いて書き直したソースを記します。
#include <iostream> #include <string> #include <boost/signals2.hpp> using namespace std; using namespace boost::signals2; //------------------------------------- // テスト関数 //------------------------------------- string a(int arg1, float arg2) { cout << "a(" << arg1 << ", " << arg2 << ") is called." << endl; return "return value is a."; } string b(int arg1, float arg2) { cout << "b(" << arg1 << ", " << arg2 << ") is called." << endl; return "return value is b."; } string c(int arg1, float arg2) { cout << "c(" << arg1 << ", " << arg2 << ") is called." << endl; return "return value is c."; } //------------------------------------- // メイン関数 //------------------------------------- int main() { signal<string (int, float)> signal; // delegateの定義 // delegateに関数登録 signal.connect(a); signal.connect(b); signal.connect(c); signal.connect(b); signal.connect(a); // delegate実行 cout << *signal(123, 45.6) << endl; cout << "--------" << endl; // 登録解除や再登など実行 signal.disconnect(b); signal.connect(c); // delegate実行 cout << *signal(456, 7.89) << endl; return 0; }
■実行結果
a(123, 45.6) is called. b(123, 45.6) is called. c(123, 45.6) is called. b(123, 45.6) is called. a(123, 45.6) is called. return value is a. -------- a(456, 7.89) is called. c(456, 7.89) is called. a(456, 7.89) is called. c(456, 7.89) is called. return value is c.
いとも簡単にDelegateの動作が実現できてしまいます。
今回も前回同様、任意クラスのメソッドは登録できませんが実行結果はまったく一緒です。
boost.signals2の詳細な使い方はマニュアルをご参照ください。
これで任意クラスのメソッド実行ができたらC#のdelgateと引けをとらないくらいに便利なものになるでしょう。