そうだ、Reactive Programmingをやろう。
(Functional) Reactive Programmingの概要
Reactive Programmingは、変数を「時間とともに変化する値」、イベントを「時間と値の組からなる無限リスト」ととらえるプログラミング手法です。
この変数のとらえ方により、GUIのいろいろなテキストを、他の値に連動して変化させることができます。Excelの計算式みたいなものです。
このイベントのとらえ方により、GoFのObserverパターンのコールバック関数を、リスト処理へと変貌させられます。
簡単なリアクティブシーケンスクラスの実装
イベントのとらえ方は、その実装とは直結しなくていいと思うので、時間は無視して作ります。とりあえずforeach
だけ作ると、こんな感じになります。
#include <iostream> #include <functional> #include <utility> template <class T> class reactive_sequence { std::function<void(T)> f_; public: template <class F> void foreach(F f) { f_ = f; } void reaction(const T& arg) { f_(arg); } }; using Point = std::pair<int, int>; reactive_sequence<Point> seq; void click_event(Point p) { seq.reaction(p); } void print_ln(Point p) { std::cout << p.first << ',' << p.second << std::endl; } int main() { // イベントが発生したときのハンドラ seq.foreach([](Point p) { print_ln(p); }); // イベント起動 click_event({2, 3}); }
出力:
2,3
次は、map
とfilter
あたりを作ろうと思います。それを作れば、これが有用だということがある程度わかると思います。