SlideShare a Scribd company logo
1 of 38
Download to read offline
Boost Fusion Library


          高橋 晶(Takahashi Akira)
             id:faith_and_brave
                     @cpp_akira
            Boost.勉強会 #4 2011/02/26(土)
                                     1/38
動機
• Boost.Fusionは、ドキュメントはしっかり書かれている。
• しかし、そのドキュメントだけ見ても何に使えばいいのかは
  さっぱりわからない。

• この発表では、Boost.Fusionをひと通り見て回り、その後この
  ライブラリをどんなケースで使用するのかを解説していきま
  す。




                                     2/38
話すこと
•   Boost.Fusionとは
•   Fusionシーケンス
•   無名ユーザー定義型と名前ありタプル
•   Fusionの使いどころ




                        3/38
Chapter.01

Boost.Fusionとは何か




                   4/38
概要
• タプルのデータ構造とアルゴリズムのライブラリ。
• Python, Scheme, Haskellなどにあるヘテロなコンテナを表現
  するために作られた。
• Boost.Fusionは元々、Boost.Spiritに含まれていた。




                                        5/38
タプルとは
• Boost Tuple Libraryなどですでに実装されている、
  std::pair(組)のN個バージョン。
• 組は2要素のみ格納できるが、タプルはN要素格納できる。


例:
pair<int, char> p(1, 'a');
tuple<int, char, string> t(1, 'a', "Hello");




                                               6/38
ヘテロなコンテナとは

あらゆる型を格納できるコンテナ。
std::vector<boost::any>などでも表現できるが、
タプルもヘテロなコンテナと見なすことができる。

tuple<int> t1(1);
tuple<int, char> t2(get<0>(t1), 'a'); // 要素を追加




                                             7/38
そしてBoost.Fusion
• タプルをヘテロなコンテナと見なすことで、タプルに対して、
  transform(map), accumulate(fold)といった有用なアルゴリズ
  ムを適用するアイデアが出てくる。

• Boost.Fusionは、 STLの概念(コンテナ、イテレータ、アルゴリ
  ズム)に基づいて、タプルに対する多くの有用なアルゴリズム
  を提供する。




                                             8/38
Boost.Fusionのコード例
#include <iostream>
#include <boost/fusion/include/vector.hpp>
#include <boost/fusion/include/for_each.hpp>

namespace fusion = boost::fusion;

struct disper {
    template <class T>                                   1
    void operator()(const T& x) const                    a
    {                                                    3.14
        std::cout << x << std::endl;
    }
};

int main()
{
    fusion::vector<int, char, double> v(1, 'a', 3.14);
    fusion::for_each(v, disper());
}



                                                  http://ideone.com/v0e0n   9/38
Chapter.02

   Fusionシーケンス




                 10/38
シーケンス
Boost.Fusionでは、タプルを
「異なる型を格納するリスト」と見なす。

リストは、同じ型の異なる値を格納する。
 型:std::vector<int>
 値:{1, 2, 3...}

タプル:異なる型の値を格納する。
 型:boost::fusion::vector<int, char, std::string>
 値:(1, ‘a’, “Hello”...)




                                           http://ideone.com/hIk2t   11/38
シーケンスの種類
           種類                    型           補足
Random Access Sequence    vector     要素にランダムアクセス可能なシー
                                     ケンス。デフォルトで使用すべき型。
Forward Sequence          list       前方向に走査可能なシーケンス。
Bidirectional Sequence    deque      双方向に走査可能なシーケンス。
                                     ただしアンドキュメント。
実際はvectorしか使わないと考えていい。
list(というかcons)はいちおうBoost.Spirit.(Qi | Karma)で使われている。
dequeを使っている人は見たことがない。

ランダムアクセスな型リスト(タプル)の実装方法は、『C++テンプレートメタプログラミ
ング』を参照。添字で特殊化している。
テンプレートの再帰が必要なくなるので、
Forward SequenceよりRandom Access Sequenceの方がコンパイルが速い。
for_each等でループのアンロールもしやすい。


                                                       12/38
イテレータ
FusionシーケンスはSTLと同様、イテレータのインタフェースを持つ。
イテレータは進むたびに異なる型を指す。

typedef fusion::vector<int, char, double> vec;

const vec v(1, 'a', 3.14);

fusion::vector_iterator<const vec, 0> first = fusion::begin(v);
fusion::vector_iterator<const vec, 3> last = fusion::end(v);
fusion::vector_iterator<const vec, 1> second = fusion::next(first);

BOOST_ASSERT(fusion::deref(first) == 1);
BOOST_ASSERT(fusion::deref(second) == 'a');


 これで、シーケンスとアルゴリズムの橋渡しができるようになった。
 ※実際は、ユーザーがイテレータを意識することはない。

                                              http://ideone.com/RlhJQ   13/38
for_eachの実装例
template <class First, class Last, class F>
void for_each_impl(First first, Last last, F f, mpl::true_) {}

template <class First, class Last, class F>
void for_each_impl(First first, Last last, F f, mpl::false_)
{
  f(deref(first));
  for_each_impl(next(first), last, f,
     result_of::equal_to<
         typename result_of::next<First>::type, Last>());
}

template <class Seq, class F>
void for_each(const Seq& seq, F f)
{
  for_each_impl(begin(seq), end(seq), f,
     result_of::equal_to<typename result_of::begin<Seq>::type,
                         typename result_of::end<Seq>::type >());
}

毎回型が変わるので、ループではなく再帰で書く                           http://ideone.com/IJZy3   14/38
アルゴリズム
• シーケンスに対するSTLライクなアルゴリズムが提供されてい
  る。

• Output Iteratorではなく戻り値で返す。

• Viewを用いた遅延評価が特徴。複数のアルゴリズムの適用
  を一度のループで処理する。

• アルゴリズムは「関数」と「メタ関数」、実行時とコンパイル時
  で一様なものが提供される。
  実行時アルゴリズムはboost::fusion名前空間。
  コンパイル時アルゴリズムはboost::fusion::result_of名前空
  間。



                                         15/38
コンパイル時と実行時
アルゴリズムの適用結果は、アルゴリズムを適用した型が返される。
そのため、実行時の値に対するアルゴリズムだけではなく、
戻り値のために、コンパイル時の型に対するアルゴリズムが用意されている。

typedef fusion::vector<int, char, std::string> vector_t;
const vector_t v(1, 'a', "Hello");

typedef
   fusion::result_of::transform<const vector_t, to_string>::type
result_type;

const result_type result = fusion::transform(v, to_string());


 transformのような処理は、ユーザーコードで書くのは稀。
 こういった処理はライブラリコードの関数テンプレートで行うのが一般的。


                                            http://ideone.com/2C4KY   16/38
アルゴリズム一覧 - Iteration

       関数                              作用                                説明
fold                f(... f(f(initial_state,e1),e2) ...eN)        前から畳み込む。
reverse_fold        f(... f(f(initial_state,eN),eN-1) ...e1)      後ろから畳み込む。
iter_fold           f(... f(f(initial_state,it1),it2) ...itN)     要素ではなくイテレータが
                                                                  渡されるfold
reverse_iter_fold   f(... f(f(initial_state,itN),itN-1) ...it1)   要素ではなくイテレータが
                                                                  渡されるreverse_fold
accumulate          f(... f(f(initial_state,e1),e2) ...eN)        foldと同じ。
for_each            f(e)...                                       全ての要素に関数を適用




                                                                                17/38
アルゴリズム一覧 - Query

           関数             説明
any             述語を満たす要素があるか
all             全ての要素が述語を満たすか
none            述語を満たす要素が存在しないか
find            値を検索
find_if         述語による検索
count           指定された値の要素を数える
count_if        指定された述語を満たす要素を数える




                                    18/38
アルゴリズム一覧 - Trasnsform

     関数            説明                関数            説明
filter       指定された型のみを抽出      insert         指定位置に要素を挿入
filter_if    述語を満たす要素を抽出      insert_range   指定位置にシーケンスを挿入
transform    全ての要素に変換関数を適用    join           2つのシーケンスを連結
replace      値を置き換える          zip            複数のシーケンスを綴じ合わせる
replace_if   述語を満たす要素を置き換える   pop_back       最後尾要素を削除
remove       指定された型を削除        pop_front      先頭要素を削除
remove_if    述語を満たす要素を削除      push_back      最後尾に要素を追加
reverse      シーケンスを逆順にする      push_front     先頭に要素を追加
clear        空のシーケンスを返す
erase        イテレータによる要素削除
erase_key    キーの指定による要素削除



                                                           19/38
Fusionシーケンスへのアダプト
Fusionには、ユーザー定義型をFusionシーケンスにアダプトする機構が
用意されている。以下はユーザー定義型のメンバ変数を列挙する処理:

struct Person {
    int identifier;
    std::string name;
    int age;
};
                                                1
BOOST_FUSION_ADAPT_STRUCT(                      Akira
    Person,                                     25
    (int, identifier)
    (std::string, name)
    (int, age)
)

const Person person = {1, "Akira", 25};
fusion::for_each(person, std::cout << _1 << ' ');
                                            http://ideone.com/gBxXw   20/38
Chapter.03

Fusionはどこで使うのか




                 21/38
ユースケース
Boost.Fusionの使いどころは大きく2つ:

1. 名前が付いているがシーケンスとしても扱いたい場合
   (RGBなど)

2. DSELの内部実装(Boost.Spirit.Qi/Karma)

3. Fusion Sequenceをコンセプトとするライブラリへの一括アダ
   プト(Boost.Geometry)




                                      22/38
RGB値
RGB値は、構造体として扱うと、名前を付けられるがシーケンス
として扱えず、配列として扱うと名前が…
という一長一短の設計の選択肢がある。

RGBを構造体にしてFusionシーケンスにアダプトすることで、
名前でのアクセスと、名前を必要としないシーケンスとしての
アクセス両方が手に入る。




                                   23/38
RGB値
以下は、簡単な画像処理(ネガ反転)。
OpenCVは内部の要素型を外部から指定できるので、
Fusionシーケンスへのアダプトが簡単にできる。
struct Color {
  uchar r, g, b;
};
...

Color c;
fusion::for_each(c, _1 = 255 - _1);




                      →
                                      http://ideone.com/HaqfD
                                                     24/38
DSELの内部実装
• DSELでは、異なる型のシーケンスを扱う機会が多い。
  たとえば、正規表現やパーサーコンビネータ。

 これらの内部実装にBoost.Fusionを使用することで、
 ユーザーコードが簡潔で柔軟になる。




                             25/38
DSELの内部実装:Boost.Spirit.Qi
Boost.SpiritではFusionを、パース式、およびパース結果の型として
使用する。

 fusion::vector<int, char, double> result;
 parse("1 a 3.14", int_ >> char_ >> double_, result);

 std::cout << result << std::endl;
                                           (1 a 3.14)




                                          http://ideone.com/btwFk   26/38
DSELの内部実装:Boost.Spirit.Qi
 Fusionシーケンスで結果を返すことにより、
 BOOST_FUSION_ADAPT_STRUCTでアダプトされた
 ユーザー定義型へ一発変換できる。
struct X {
  int n;
  char c;
  double d;
};
...

X result;
parse("1 a 3.14", int_ >> char_ >> double_, result);

std::cout << result.n << ‘ ’ << result.c << ‘ ’ << result.d;

                                                      1 a 3.14
                                             http://ideone.com/btwFk 27/38
DSELの内部実装:Boost.Spirit.Qi
さらに、charのシーケンスを以下のいずれの型でも扱えるため、
ユーザーコードが非常に柔軟になる:
fusion::vector<char, char, ...>
std::string
std::vector<char>

  fusion::vector<char, char, char> result;
  parse("1 a 3.14", char_ >> char_ >> char_, result);
                                     http://ideone.com/NTZ6z

  std::string result;
  parse("1 a 3.14", char_ >> char_ >> char_, result);
                                     http://ideone.com/4FonC

  std::vector<char> result;
  parse("1 a 3.14", char_ >> char_ >> char_, result);
                                     http://ideone.com/do3IO

                                                               28/38
Boost.Geometry
 Boost.Geometryでは、Fusionシーケンスとしてアダプトされた
 全ての型を、Geometryのcoordinateとして扱うことができる。

 以下は、ユーザー定義型で、2つの点の距離を求める
 distanceアルゴリズムを使用する例:
namespace bg = boost::geometry;

struct Point { float x, y; };
BOOST_FUSION_ADAPT_STRUCT(Point, (float, x) (float, y))

const Point a = {0.0f, 0.0f};
const Point b = {3.0f, 3.0f};

std::cout << bg::distance(a, b) << std::endl;            4.24264


                       この機構はワシが作った。
                                                http://ideone.com/OYf5l 29/38
Chapter.04

ライブラリ設計のお話




             30/38
名前
• タプルは値(メンバ変数)と値の集合(クラス)に、名前のない複
  合データ型である。

• Boost.Fusionでは、ユーザー定義型をFusionシーケンスにア
  ダプトすることによって、名前ありタプルと見なすことができる
  ようになる。
  つまり、以下のようになる:

 タプル:名無しユーザー定義型
 ユーザー定義型:名前ありタプル




                                    31/38
ライブラリとユーザーコード
• Boost.Fusionでは、「名前」を意識して、ライブラリコードとユー
  ザーコードで、コードの棲み分けを行うことが重要。
  何も考えずユーザーコードをFusionを使いまくると、名前のな
  い値で溢れかえってしまう。以下のようにしよう:


       ユーザーコード : 名前あり世界
     (ユーザー定義型 + アダプト) x アルゴリズム




         ライブラリコード : 名無し世界
        fusion::vector, transform, etc...
                                            32/38
ユーザーコードでタプルを使わない
• タプルは、クラスを作るのがめんどくさいときに即興で使われ
  ることが多い。

• しかし、やはりめんどくさがらずに値(メンバ変数)と値の集合
  (クラス)には名前を付けよう。

• データを単なるシーケンスとして扱っていいのはライブラリの
  中だけ。




                              33/38
アダプトしよう
• ユーザーコードでは、ユーザー定義型をFusionシーケンスへ
  アダプトすることで、有用なアルゴリズムを手に入れよう。

• ライブラリがFusionで設計されてさえいれば、ユーザー定義
  型ですでに定義済みの有用なアルゴリズムが手に入る
  (パーサー、一般的なアルゴリズム、幾何学の関数、線形代
  数の関数など)。




                               34/38
ライブラリコードで名前を使いたい場合
  全てのライブラリコードで名前が使えないと少々不便。
  そんなときは、型と値の対応表であるfusion::mapを使用する。
struct id {}; struct name {};

template <class AssocSeq>
void foo_impl(const AssocSeq& seq)
{
    std::cout << "id:"    << fusion::at_key<id>(seq)
              << " name:" << fusion::at_key<name>(seq);
}

template <class Seq>
void foo(const Seq& seq)
{
    foo_impl(fusion::map_tie<id, name>(
                fusion::at_c<0>(seq),
                fusion::at_c<1>(seq)));
}

foo(fusion::make_vector(1, "Akira"));                     35/38
ライブラリ世界での名前
• fusion::mapを使用することで、ライブラリ世界で名前が手に
  入る。


          ユーザーコード : 名前あり世界
     (ユーザー定義型 + アダプト) x アルゴリズム




                    ライブラリコード : 名無し世界
名前   fusion::map
                   fusion::vector, transform, etc...

                                                       36/38
まとめ
• Boost.Fusionはタプルをリストと見なす
• Boost.Fusionはタプルに名前をもたらす
• ライブラリの設計にBoost.Fusionを取り入れることで、
  ユーザーコードが柔軟になる
• まだまだ事例が少ないので、各自で応用を考えよう




                               37/38
参考文献
• Boost Fusion Library
  http://www.boost.org/libs/fusion/doc/html/index.html

• Fusion by example
  http://www.boostcon.com/site-
  media/var/sphene/sphwiki/attachment/2007/05/28/An_Intro
  duction_to_Boost.Fusion.pdf

• cpppeg : PEGパーサー
  https://github.com/kik/cpppeg/blob/master/peg.hpp

• Spirit: History and Evolution
  http://blip.tv/file/4245756

                                                         38/38

More Related Content

What's hot

Boost.Preprocessorでプログラミングしましょう
Boost.PreprocessorでプログラミングしましょうBoost.Preprocessorでプログラミングしましょう
Boost.Preprocessorでプログラミングしましょうdigitalghost
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかYuki Miyatake
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All ThingsUnityTechnologiesJapan002
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門Norishige Fukushima
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎信之 岩永
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013Ryo Sakamoto
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチンyohhoy
 
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Hiro H.
 
マルチコアを用いた画像処理
マルチコアを用いた画像処理マルチコアを用いた画像処理
マルチコアを用いた画像処理Norishige Fukushima
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニックGenya Murakami
 
Unityネイティブプラグインマニアクス #denatechcon
Unityネイティブプラグインマニアクス #denatechconUnityネイティブプラグインマニアクス #denatechcon
Unityネイティブプラグインマニアクス #denatechconDeNA
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッドKohsuke Yuasa
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexprGenya Murakami
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ信之 岩永
 

What's hot (20)

Boost.Preprocessorでプログラミングしましょう
Boost.PreprocessorでプログラミングしましょうBoost.Preprocessorでプログラミングしましょう
Boost.Preprocessorでプログラミングしましょう
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
Boost tour 1.60.0 merge
Boost tour 1.60.0 mergeBoost tour 1.60.0 merge
Boost tour 1.60.0 merge
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
マルチコアを用いた画像処理
マルチコアを用いた画像処理マルチコアを用いた画像処理
マルチコアを用いた画像処理
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニック
 
レシピの作り方入門
レシピの作り方入門レシピの作り方入門
レシピの作り方入門
 
LLVM最適化のこつ
LLVM最適化のこつLLVM最適化のこつ
LLVM最適化のこつ
 
Unityネイティブプラグインマニアクス #denatechcon
Unityネイティブプラグインマニアクス #denatechconUnityネイティブプラグインマニアクス #denatechcon
Unityネイティブプラグインマニアクス #denatechcon
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 

Similar to Boost Fusion Library

Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPAkira Takahashi
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーmganeko
 
Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweightgintenlabo
 
エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7Tetsuya Morimoto
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんかcch-robo
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説do_aki
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Ransui Iso
 
Swift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsSwift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsTomohiro Kumagai
 
Essential Scala 第5章 シーケンス処理
Essential Scala 第5章 シーケンス処理Essential Scala 第5章 シーケンス処理
Essential Scala 第5章 シーケンス処理Takuya Tsuchida
 
研究生のためのC++ no.2
研究生のためのC++ no.2研究生のためのC++ no.2
研究生のためのC++ no.2Tomohiro Namba
 
今さら聞けないHadoop勉強会第3回 セントラルソフト株式会社(20120327)
今さら聞けないHadoop勉強会第3回 セントラルソフト株式会社(20120327)今さら聞けないHadoop勉強会第3回 セントラルソフト株式会社(20120327)
今さら聞けないHadoop勉強会第3回 セントラルソフト株式会社(20120327)YoheiOkuyama
 
エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半Tetsuya Morimoto
 
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)Hiro H.
 
Final LINQ Extensions
Final LINQ ExtensionsFinal LINQ Extensions
Final LINQ ExtensionsKouji Matsui
 

Similar to Boost Fusion Library (20)

Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
 
Boost Tour 1.50.0
Boost Tour 1.50.0Boost Tour 1.50.0
Boost Tour 1.50.0
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweight
 
エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんか
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 
boost tour 1.48.0 all
boost tour 1.48.0 allboost tour 1.48.0 all
boost tour 1.48.0 all
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
Boost tour 1_40_0
Boost tour 1_40_0Boost tour 1_40_0
Boost tour 1_40_0
 
Swift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsSwift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdots
 
Essential Scala 第5章 シーケンス処理
Essential Scala 第5章 シーケンス処理Essential Scala 第5章 シーケンス処理
Essential Scala 第5章 シーケンス処理
 
What is template
What is templateWhat is template
What is template
 
研究生のためのC++ no.2
研究生のためのC++ no.2研究生のためのC++ no.2
研究生のためのC++ no.2
 
今さら聞けないHadoop勉強会第3回 セントラルソフト株式会社(20120327)
今さら聞けないHadoop勉強会第3回 セントラルソフト株式会社(20120327)今さら聞けないHadoop勉強会第3回 セントラルソフト株式会社(20120327)
今さら聞けないHadoop勉強会第3回 セントラルソフト株式会社(20120327)
 
エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半
 
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
 
Final LINQ Extensions
Final LINQ ExtensionsFinal LINQ Extensions
Final LINQ Extensions
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 

More from Akira Takahashi (20)

Cpp20 overview language features
Cpp20 overview language featuresCpp20 overview language features
Cpp20 overview language features
 
Cppmix 02
Cppmix 02Cppmix 02
Cppmix 02
 
Cppmix 01
Cppmix 01Cppmix 01
Cppmix 01
 
Modern C++ Learning
Modern C++ LearningModern C++ Learning
Modern C++ Learning
 
cpprefjp documentation
cpprefjp documentationcpprefjp documentation
cpprefjp documentation
 
C++1z draft
C++1z draftC++1z draft
C++1z draft
 
Boost tour 1_61_0 merge
Boost tour 1_61_0 mergeBoost tour 1_61_0 merge
Boost tour 1_61_0 merge
 
Boost tour 1_61_0
Boost tour 1_61_0Boost tour 1_61_0
Boost tour 1_61_0
 
error handling using expected
error handling using expectederror handling using expected
error handling using expected
 
Boost tour 1.60.0
Boost tour 1.60.0Boost tour 1.60.0
Boost tour 1.60.0
 
Boost container feature
Boost container featureBoost container feature
Boost container feature
 
Boost Tour 1_58_0 merge
Boost Tour 1_58_0 mergeBoost Tour 1_58_0 merge
Boost Tour 1_58_0 merge
 
Boost Tour 1_58_0
Boost Tour 1_58_0Boost Tour 1_58_0
Boost Tour 1_58_0
 
C++14 solve explicit_default_constructor
C++14 solve explicit_default_constructorC++14 solve explicit_default_constructor
C++14 solve explicit_default_constructor
 
C++14 enum hash
C++14 enum hashC++14 enum hash
C++14 enum hash
 
Multi paradigm design
Multi paradigm designMulti paradigm design
Multi paradigm design
 
Start Concurrent
Start ConcurrentStart Concurrent
Start Concurrent
 
Programmer mind
Programmer mindProgrammer mind
Programmer mind
 
Boost.Study 14 Opening
Boost.Study 14 OpeningBoost.Study 14 Opening
Boost.Study 14 Opening
 
Executors and schedulers
Executors and schedulersExecutors and schedulers
Executors and schedulers
 

Boost Fusion Library