概要 SegmentTree などのように、代数的構造 (特にモノイド) を乗せるデータ構造は多い。 この部分の設計は様々だが、「静的メンバを実装した型を受け取る」設計を他の設計と比較する。 設計のバリエーション A: std::function で関数オブジェクトを持つ template <class T> class segment_tree { std::function<T(T, T)> op; T id; }; B: 関数オブジェクトをそのまま持つ template <class T, class F> class segment_tree { F op; T id; }; C: 演算子がオーバーロードされた型を受け取る struct add { int val; add operator+(add r) { return add(val + r.val); } add() :