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

いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例Fixstars Corporation
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたMITSUNARI Shigeo
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングKohsuke Yuasa
 
Protocol Buffers 入門
Protocol Buffers 入門Protocol Buffers 入門
Protocol Buffers 入門Yuichi Ito
 
Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉HyunJoon Park
 
Zynq mp勉強会資料
Zynq mp勉強会資料Zynq mp勉強会資料
Zynq mp勉強会資料一路 川染
 
コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!amusementcreators
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 TipsTakaaki Suzuki
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpsonickun
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門Fixstars Corporation
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチンyohhoy
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺MITSUNARI Shigeo
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し増田 亨
 
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~ CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~ SEGADevTech
 
Squirrel
SquirrelSquirrel
Squirrelmelpon
 
Verilator勉強会 2021/05/29
Verilator勉強会 2021/05/29Verilator勉強会 2021/05/29
Verilator勉強会 2021/05/29ryuz88
 
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法kazkiti
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ信之 岩永
 
ClojurianからみたElixir
ClojurianからみたElixirClojurianからみたElixir
ClojurianからみたElixirKent Ohashi
 

What's hot (20)

いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみたIntro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 
Protocol Buffers 入門
Protocol Buffers 入門Protocol Buffers 入門
Protocol Buffers 入門
 
Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉Modern C++의 타입 추론과 람다, 컨셉
Modern C++의 타입 추론과 람다, 컨셉
 
Zynq mp勉強会資料
Zynq mp勉強会資料Zynq mp勉強会資料
Zynq mp勉強会資料
 
コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
 
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~ CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
 
Squirrel
SquirrelSquirrel
Squirrel
 
Verilator勉強会 2021/05/29
Verilator勉強会 2021/05/29Verilator勉強会 2021/05/29
Verilator勉強会 2021/05/29
 
初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法初心者向けCTFのWeb分野の強化法
初心者向けCTFのWeb分野の強化法
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 
ClojurianからみたElixir
ClojurianからみたElixirClojurianからみたElixir
ClojurianからみたElixir
 

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 merge
Boost tour 1.60.0 mergeBoost tour 1.60.0 merge
Boost tour 1.60.0 merge
 
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
 

Boost Fusion Library