| 1 | [[PageOutline]] |
| 2 | = Boost.勉強会 !#4 ノート = |
| 3 | |
| 4 | == Boost Fusion Library == |
| 5 | |
| 6 | === タプルとは === |
| 7 | |
| 8 | * Boost Tuple Library |
| 9 | * std::pair の N個版 |
| 10 | |
| 11 | === ヘテロなコンテナとは === |
| 12 | |
| 13 | あらゆる型を格納できるコンテナ。 std::vector<boost::any> |
| 14 | タプルもヘテロの一種 |
| 15 | |
| 16 | === Boost.Fusion === |
| 17 | |
| 18 | タプルをヘテロとみなして STL チックな種々のアルゴリズムを適用するライブラリ。 |
| 19 | |
| 20 | === Fusion シーケンス === |
| 21 | |
| 22 | * vector, list, deque が使える |
| 23 | * イテレータもいける |
| 24 | * for_each の実装例 ... 要素毎に型が異なるので再起関数として実装する |
| 25 | |
| 26 | === アルゴリズム === |
| 27 | |
| 28 | * View を用いた遅延評価が特徴。 |
| 29 | |
| 30 | === 使いどころ === |
| 31 | |
| 32 | * 名前がついているがシーケンスとしても扱いたい場合 (RGB など) |
| 33 | * 構造体として扱うと名前を付けられるがシーケンスとして扱えない |
| 34 | * 配列だと名前が… |
| 35 | * DSEL の内部実装 (Boost.Spirit.Qj/Karma) |
| 36 | * 異なる型のシーケンスを扱う機会が多い。Regexp やパーサコンビネータ。 |
| 37 | {{{ |
| 38 | fusion::vector<int, char, double> result; |
| 39 | parse("1 a 3.14", int_ >> char_ >> double_, result); |
| 40 | }}} |
| 41 | * Fusion Sequence をコンセプトとするライブラリへの一括アダプト (Boost.Geometry) |
| 42 | * Fusion シーケンスとしてアダプトされたすべての型を、 Geometry の coordinate として扱うことが出来る。 |
| 43 | |
| 44 | === ライブラリの設計 === |
| 45 | |
| 46 | * タプルは値 (メンバ変数) と値の集合 (クラス) に、名前のない複合データ型。 |
| 47 | * Boost.Fusion では、ユーザー定義型を Fusion シーケンスにアダプトすることで、名前有りタプルとみなすことが出来るようになる。 |
| 48 | * ユーザーコード: 名前有り世界 / ライブラリコード: 名無し世界 として棲み分けするとよさげ…。 |
| 49 | * タプルはクラスを作るのが面倒くさいときに即興で使われることが多い。... メンテナンス性が低下する |
| 50 | * データを単なるシーケンスとして扱って良いのはライブラリの中だけ。 |
| 51 | * ユーザーコードではユーザー定義型を fusion シーケンスへアダプトすることで有用なアルゴリズムが使えるようになる。 |
| 52 | |
| 53 | === まとめ === |
| 54 | |
| 55 | * タプルをリストとみなす |
| 56 | * タプルに名前をもたらす |
| 57 | * ライブラリの設計に取り入れればユーザーコードが柔軟に |