Submit Search
Upload
Boostのあるプログラミング生活
•
3 likes
•
3,842 views
Akira Takahashi
Follow
2010/08/28 わんくま同盟 横浜勉強会 #03
Read less
Read more
Report
Share
Report
Share
1 of 59
Download now
Download to read offline
Recommended
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
alwei
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
Genya Murakami
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
Genya Murakami
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
masayoshi takahashi
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
Hiro H.
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
async/await のしくみ
async/await のしくみ
信之 岩永
Recommended
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
alwei
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
Genya Murakami
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
Genya Murakami
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
masayoshi takahashi
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
Hiro H.
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
async/await のしくみ
async/await のしくみ
信之 岩永
中3女子でもわかる constexpr
中3女子でもわかる constexpr
Genya Murakami
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
Constexpr 中3女子テクニック
Constexpr 中3女子テクニック
Genya Murakami
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Yoshifumi Kawai
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Hiro H.
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理
DADA246
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
C#で速度を極めるいろは
C#で速度を極めるいろは
Core Concept Technologies
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021
Atsushi Nakamura
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
Keisuke Fukuda
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
MITSUNARI Shigeo
C#とILとネイティブと
C#とILとネイティブと
信之 岩永
【Unity】 Behavior TreeでAIを作る
【Unity】 Behavior TreeでAIを作る
torisoup
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
MITSUNARI Shigeo
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
Yoshifumi Kawai
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
LLVM最適化のこつ
LLVM最適化のこつ
MITSUNARI Shigeo
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
C++ Presentation
C++ Presentation
Carson Wilber
闇魔術を触ってみた
闇魔術を触ってみた
Satoshi Sato
More Related Content
What's hot
中3女子でもわかる constexpr
中3女子でもわかる constexpr
Genya Murakami
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
Constexpr 中3女子テクニック
Constexpr 中3女子テクニック
Genya Murakami
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Yoshifumi Kawai
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Hiro H.
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理
DADA246
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
C#で速度を極めるいろは
C#で速度を極めるいろは
Core Concept Technologies
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021
Atsushi Nakamura
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
Keisuke Fukuda
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
MITSUNARI Shigeo
C#とILとネイティブと
C#とILとネイティブと
信之 岩永
【Unity】 Behavior TreeでAIを作る
【Unity】 Behavior TreeでAIを作る
torisoup
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
MITSUNARI Shigeo
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
Yoshifumi Kawai
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
LLVM最適化のこつ
LLVM最適化のこつ
MITSUNARI Shigeo
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
What's hot
(20)
中3女子でもわかる constexpr
中3女子でもわかる constexpr
プログラムを高速化する話
プログラムを高速化する話
Constexpr 中3女子テクニック
Constexpr 中3女子テクニック
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
C#で速度を極めるいろは
C#で速度を極めるいろは
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
C#とILとネイティブと
C#とILとネイティブと
【Unity】 Behavior TreeでAIを作る
【Unity】 Behavior TreeでAIを作る
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
LLVM最適化のこつ
LLVM最適化のこつ
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
Viewers also liked
C++ Presentation
C++ Presentation
Carson Wilber
闇魔術を触ってみた
闇魔術を触ってみた
Satoshi Sato
C++14 Overview
C++14 Overview
Akira Takahashi
C++の黒魔術
C++の黒魔術
Daichi OBINATA
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
Yuki Tamura
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
Template Meta Programming入門から応用まで
Template Meta Programming入門から応用まで
yoshihikoozaki5
Viewers also liked
(7)
C++ Presentation
C++ Presentation
闇魔術を触ってみた
闇魔術を触ってみた
C++14 Overview
C++14 Overview
C++の黒魔術
C++の黒魔術
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Template Meta Programming入門から応用まで
Template Meta Programming入門から応用まで
Similar to Boostのあるプログラミング生活
C++模板与泛型编程
C++模板与泛型编程
deer hope
C++模板与泛型编程
C++模板与泛型编程
deer hope
Uso de la Programación para la Seguridad en Redes (a.k.a. Sockets y Shellcoding)
Uso de la Programación para la Seguridad en Redes (a.k.a. Sockets y Shellcoding)
Pedro Valera
Clase5_Python-CTIC
Clase5_Python-CTIC
Abraham Zamudio
Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013
Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013
Moscow.pm
Lecture7
Lecture7
orgil
Javaバイトコード入門
Javaバイトコード入門
Kota Mizushima
ADO.NET Entity Framework 4
ADO.NET Entity Framework 4
Raffaele Fanizzi
帰って来たNemerle
帰って来たNemerle
Kota Mizushima
03 3-create-db-application-ado-dot-net Create Database Application with using...
03 3-create-db-application-ado-dot-net Create Database Application with using...
Warawut
MongoDB Indexing: The Details
MongoDB Indexing: The Details
MongoDB
Türsteher für Bohnen
Türsteher für Bohnen
Zambrovski Simon
Aspetos gerais de desenvolvimento web.
Aspetos gerais de desenvolvimento web.
Corcioli
Вебинар Томулевича materialized.path 2
Вебинар Томулевича materialized.path 2
Media Gorod
Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储
zhen chen
N03 app engineseminar
N03 app engineseminar
Sun-Jin Jang
Entity+framework+
Entity+framework+
Rey zhang
Lecture9
Lecture9
orgil
UglifyJS 使用文档
UglifyJS 使用文档
明 李
Lecture6
Lecture6
orgil
Similar to Boostのあるプログラミング生活
(20)
C++模板与泛型编程
C++模板与泛型编程
C++模板与泛型编程
C++模板与泛型编程
Uso de la Programación para la Seguridad en Redes (a.k.a. Sockets y Shellcoding)
Uso de la Programación para la Seguridad en Redes (a.k.a. Sockets y Shellcoding)
Clase5_Python-CTIC
Clase5_Python-CTIC
Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013
Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013
Lecture7
Lecture7
Javaバイトコード入門
Javaバイトコード入門
ADO.NET Entity Framework 4
ADO.NET Entity Framework 4
帰って来たNemerle
帰って来たNemerle
03 3-create-db-application-ado-dot-net Create Database Application with using...
03 3-create-db-application-ado-dot-net Create Database Application with using...
MongoDB Indexing: The Details
MongoDB Indexing: The Details
Türsteher für Bohnen
Türsteher für Bohnen
Aspetos gerais de desenvolvimento web.
Aspetos gerais de desenvolvimento web.
Вебинар Томулевича materialized.path 2
Вебинар Томулевича materialized.path 2
Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储
N03 app engineseminar
N03 app engineseminar
Entity+framework+
Entity+framework+
Lecture9
Lecture9
UglifyJS 使用文档
UglifyJS 使用文档
Lecture6
Lecture6
More from Akira Takahashi
Cpp20 overview language features
Cpp20 overview language features
Akira Takahashi
Cppmix 02
Cppmix 02
Akira Takahashi
Cppmix 01
Cppmix 01
Akira Takahashi
Modern C++ Learning
Modern C++ Learning
Akira Takahashi
cpprefjp documentation
cpprefjp documentation
Akira Takahashi
C++1z draft
C++1z draft
Akira Takahashi
Boost tour 1_61_0 merge
Boost tour 1_61_0 merge
Akira Takahashi
Boost tour 1_61_0
Boost tour 1_61_0
Akira Takahashi
error handling using expected
error handling using expected
Akira Takahashi
Boost tour 1.60.0 merge
Boost tour 1.60.0 merge
Akira Takahashi
Boost tour 1.60.0
Boost tour 1.60.0
Akira Takahashi
Boost container feature
Boost container feature
Akira Takahashi
Boost Tour 1_58_0 merge
Boost Tour 1_58_0 merge
Akira Takahashi
Boost Tour 1_58_0
Boost Tour 1_58_0
Akira Takahashi
C++14 solve explicit_default_constructor
C++14 solve explicit_default_constructor
Akira Takahashi
C++14 enum hash
C++14 enum hash
Akira Takahashi
Multi paradigm design
Multi paradigm design
Akira Takahashi
Start Concurrent
Start Concurrent
Akira Takahashi
Programmer mind
Programmer mind
Akira Takahashi
Boost.Study 14 Opening
Boost.Study 14 Opening
Akira Takahashi
More from Akira Takahashi
(20)
Cpp20 overview language features
Cpp20 overview language features
Cppmix 02
Cppmix 02
Cppmix 01
Cppmix 01
Modern C++ Learning
Modern C++ Learning
cpprefjp documentation
cpprefjp documentation
C++1z draft
C++1z draft
Boost tour 1_61_0 merge
Boost tour 1_61_0 merge
Boost tour 1_61_0
Boost tour 1_61_0
error handling using expected
error handling using expected
Boost tour 1.60.0 merge
Boost tour 1.60.0 merge
Boost tour 1.60.0
Boost tour 1.60.0
Boost container feature
Boost container feature
Boost Tour 1_58_0 merge
Boost Tour 1_58_0 merge
Boost Tour 1_58_0
Boost Tour 1_58_0
C++14 solve explicit_default_constructor
C++14 solve explicit_default_constructor
C++14 enum hash
C++14 enum hash
Multi paradigm design
Multi paradigm design
Start Concurrent
Start Concurrent
Programmer mind
Programmer mind
Boost.Study 14 Opening
Boost.Study 14 Opening
Boostのあるプログラミング生活
1.
Boostのあるプログラミング生活
高橋晶(Akira Takahashi) ブログ:「Faith and Brave – C++で遊ぼう」 http://d.hatena.ne.jp/faith_and_brave/ わんくま横浜勉強会 2010/08/28(土)
2.
宣伝コーナー プログラミング雑誌 (ライクな書籍)を始めました。 タイトルは プログラミングの魔導書 ~Programmers’
Grimoire~ です。 書籍版は完全受注生産のためすでに締め 切りましたが、PDF版は購入可能です。 http://longgate.co.jp/products.html
3.
はじめに Boostによって、C++でのプログラミングは かなり容易で、強力なものとなりました。 今回は、Boost 1.43.0時点でのとくに強力で、 私が好んで使用しているライブラリを紹介します。
4.
アジェンダ 1.
MultiIndex 2. Spirit.Qi 3. PropertyTree 4. Range 2.0 5. Under Construction
5.
Chapter 1
Multi Index 統合データ構造
6.
MultiIndexとは何か 複数のインデックスを持てるコンテナ!
組み合わせは自由自在!
7.
MultiIndex Introduction 1/5
まずは簡単なサンプルから。 挿入順を知っているstd::setです。 using namespace boost::multi_index; typedef multi_index_container< int, indexed_by< ordered_unique<identity<int> >, // std::setで、 sequenced<> // 挿入順を知ってる > > container; ※ファイルに入っている順序に一覧表示、という処理を想定 Next >>
8.
MultiIndex Introduction 2/5
何も気にしなければstd::setとして使えます container c; c.insert(3); c.insert(1); c.insert(4); boost::for_each(c, disp); 1 3 4 std::setと同じく、ソートされて表示される Next >>
9.
MultiIndex Introduction 3/5
1番目のインデックス(つまりsequenced)として 使用すると挿入順に処理できます container c; c.insert(3); c.insert(1); c.insert(4); boost::for_each(c.get<1>(), disp); 3 1 4 挿入順に出力される。 Next >> ordered_uniqueを明示的に取得したい場合はget<0>()
10.
MultiIndex Introduction 4/5 0とか1とかいうインデックス番号なんて覚えられない! インデックスにタグ(名前)を付けましょう。 struct
order {}; struct seq {}; typedef multi_index_container< int, indexed_by< ordered_unique<tag<order>, identity<int> >, sequenced<tag<seq> > > > container; Next >>
11.
MultiIndex Introduction 5/5
タグを指定してインデックスを取得できます。 container c; c.insert(3); c.insert(1); c.insert(4); boost::for_each(c.get<seq>(), disp); 3 1 4 挿入順に出力される。 ordered_uniqueを明示的に取得したい場合はget<order>()
12.
End of Introduction あとはインデックスの種類と組み合わせだけ!
13.
提供されているインデックス
インデックス 対応するコンテナ ordered_unique std::set (デフォルト) ordered_non_unique std::multiset hashed_unique boost::unordered_set hashed_non_unique boost::unordered_multiset sequenced std::list random_access std::vector
14.
活用例 1/4 複数のキーを持つ辞書
Next >>
15.
活用例 2/4 こんな構造体があるとして struct
file { std::string name; std::size_t size; file_kind kind; datetime update_date; }; Next >>
16.
活用例 3/4
memberを使用して、 どのメンバ変数をキーにするか指定する typedef multi_index_container< file, indexed_by< ordered_unique< member<file, std::string, &file::name> >, ordered_non_unique<member<file, std::size_t, &file::size> >, ordered_non_unique<member<file, file_kind, &file::kind> >, ordered_non_unique<member<file, datetime, &file::update_date> > > > file_container; Next >>
17.
活用例 4/4 タグを付けて、最終的にこんな感じで使えます void disp_file_info(const
file&); file_container files; ... // 名前順に並び替えて表示 boost::for_each(files.get<name_order>(), disp_file_info); // ファイル種類をキーにして、jpgファイルを検索 if (files.get<kind_order>().find(file_kind::jpeg) != files.get<kind_order>().end()) { ... }
18.
まとめ • 応用範囲はとても広い • 実装の話はしませんが、効率は自分で作るより数
万倍いいです。 そのへんの話はk.inabaさんのセッションをみてくだ さい: http://www.ustream.tv/recorded/2968920 • ドキュメント http://www.boost.org/libs/multi_index/doc/index.html
19.
アドバイス 分割統治しましょう。 じゃないとコード量が爆発します。 Typedef Templateとか覚えておくといいです。
20.
Chapter 2
Spirit.Qi 構文解析DSEL
21.
はじめに 自前の構文解析してたりしませんか?
22.
はじめに 文字列のfind関数とか使ってませんか?
23.
はじめに 1文字ずつ自分で解析したりしてませんか?
24.
はじめに そんな自前の構文解析から卒業できます。
そう、Qiならね。
25.
Qiとは何か • Boost.Spiritの構文解析ライブラリであり、
DSEL(Domain Specific Enbedded Language : ドメイン特化組み込み言語) • Qiの読みは「キ」。気です。 私は「キューアイ」と読んでるのでそれでいき ます。
26.
まず下準備 こんなの用意しておきます。 begin(), end()を書かないための単なるラッパー です。 template <class
Parser, class Result> bool parse(const std::string& s, const Parser& p, Result& result) { std::string::const_iterator it = s.begin(); return boost::spirit::qi::parse(it, s.end(), p, result); } ついでに、名前空間を省略しておきます。 using namespace boost::spirit::qi;
27.
カッコの中身を取り出してみる operator>>()演算子と、 int_,
char_等の各型用のパーサーを使用します。 const std::string s = “(123)”; typedef int result_type; typedef rule<std::string::const_iterator, result_type()> rule_type; const rule_type r = ‘(’ >> int_ >> ‘)’; result_type result; parse(s, r, result); std::cout << result << std::endl; 123 処理は実質1行!
28.
データ型パーサー
パーサー 型(マッチする例) int_ int(123) double_ double(3.14) bin unsigned int(0101) hex unsigned int(1a) char_ char(a) auto_ 自動的に推論
29.
CSVを解析してみる %はstd::vector<T>を返す単純な繰り返し用パーサー const std::string
s = “123,456,789”; typedef std::vector<int> result_type; typedef rule<std::string::const_iterator, result_type()> rule_type; const rule_type r = int_ % ‘,’; // カンマ区切り、要素はint result_type result; parse(s, r, result); boost::for_each(result, disp); 123 456 789
30.
IPv4を解析してみる ,を.に変えるだけ。 const std::string
s = “192.168.0.1”; typedef std::vector<int> result_type; typedef rule<std::string::const_iterator, result_type()> rule_type; const rule_type r = int_ % ‘.’; // ドット区切り、要素はint result_type result; parse(s, r, result); boost::for_each(result, disp); 192 168 0 1
31.
型が異なるシーケンスの場合 Boost.Fusionのシーケンスで結果を受け取る const
std::string s = “123,Akira,25”; typedef fusion::vector<int, std::string, int> result_type; typedef rule<std::string::const_iterator, result_type()> rule_type; const rule_type r = int_ >> ‘,’ >> *(char_ - ‘,’) >> ‘,’ >> int_; result_type result; parse(s, r, result); std::cout << result << std::endl; (123 Akira 25)
32.
パーサー演算子
演算子 説明 >> シーケンス。 Fusionのシーケンスを返す。 *a 0回以上の繰り返し。 std::vector<A>, std::stringを返す。 a%b b区切りの1回以上の繰り返し。 std::vector<A>を返す。 a – b 差。bではない間。
33.
パーサーディレクティブ
演算子 説明 omit[a] aのパースは行うが結果はいら ない。 repeat[a] パースに成功する限り、aパー サーを繰り返す。 std::vector<A>を返す。 repeat(N)[a] N回aパーサーを繰り返す。 std::vector<A>を返す。
34.
パーサーディレクティブの例 1/2 カッコの中身を取り出す際、
前に付いている文字列はいらない、という場合。 const std::string s = “abc(123)”; typedef int result_type; typedef rule<std::string::const_iterator, result_type()> rule_type; const rule_type r = omit[*(char_ - '(')] >> ‘(’ >> int_ >> ‘)’; result_type result; parse(s, r, result); std::cout << result << std::endl; 123
35.
パーサーディレクティブの例 1/2 N個のデータを読む。 const
std::string s = “(123)(456)(789)”; typedef std::vector<int> result_type; typedef rule<std::string::const_iterator, result_type()> rule_type; const rule_type r = repeat(3)[‘(’ >> int_ >> ‘)’]; // (3)は省略可 result_type result; parse(s, r, result); boost::for_each(result, disp) 123 456 789
36.
最後の例 1/2 パース時に構造体に一発変換する struct
person { int id; std::string name; int age; }; BOOST_FUSION_ADAPT_STRUCT( person, (int, id) (std::string, name) (int, age) ) Boost.Fusionには、ユーザー定義の型を Fusionのシーケンスとしてアダプトする機能がある
37.
最後の例 2/2 構造体で結果を受け取る const
std::string s = “123,Akira,25”; typedef person result_type; typedef rule<std::string::const_iterator, result_type()> rule_type; const rule_type r = int_ >> ‘,’ >> *(char_ - ‘,’) >> ‘,’ >> int_; result_type p; parse(s, r, p); std::cout << p.id << “ ” << p.name << “ ” << p.age << std::endl; 123 Akira 25
38.
話さなかったこと •
セマンティックアクション • Spirit.Phoenixとの連携 • 文字コードの扱いほげほげ • イテレータによる遅延パース • エラー処理
39.
まとめ • Spirit.Qiは簡単かつ強力です。 • 構造体へも一発パースできます。 •
読めます。 • ドキュメント http://www.boost.org/libs/spirit/doc/html/spirit/qi. html
40.
Chapter 3
Property Tree ツリー構造の汎用プロパティ管理
41.
PropertyTreeとは • ツリー構造への一般的なアクセス方法を提供
するライブラリ • 使用する型はboost::property_tree::ptree • 待望のXMLパーサー、JSONパーサー搭載 (他にも、INFOとINIのパーサーがある)
42.
XMLパーサー XMLの読込、要素、属性の取得。 XMLパーサーにはRapidXmlを採用している。
<root> <elem attr="World"> Hello using namespace boost::property_tree; </elem> </root> ptree pt; read_xml("test.xml", pt, xml_parser::trim_whitespace); // 要素の取得 const string& elem = pt.get<string>("root.elem"); // 属性の取得 : <xmlattr>という特殊な要素名を介してアクセスする const string& attr = pt.get<string>("root.elem.<xmlattr>.attr");
43.
JSONパーサー JSONの読込、データの取得。 パーサーはSpirit.Classicで書かれている。
{ "Data": { "Value": 314, using namespace boost::property_tree; "Str": "Hello" } ptree pt; } read_json("test.json", pt); const int value = pt.get<int>("Data.Value"); const string& str = pt.get<string>("Data.Str");
44.
さらっとまとめと注意事項 • XMLパーサーがやっと入りました。 • XPathじゃなくPropertyTreeの独自構文によるアクセ
スなので注意。 • ptree::getは失敗時に例外投げる。 boost::optionalを返すptree::get_optionalもあります。 • ドキュメント http://www.boost.org/doc/html/property_tree.html
45.
Chapter 4
Range 2.0 Adaptor & Algorithms
46.
Boost.Range 2.0
Boost 1.43.0で、 Boost.Rangeのバージョンが2.0になりました。
47.
Boost.Range 1.0 1.0でできること: template
<class Range, class T> typename boost::range_iterator<Range>::type find(Range& r, const T& value) { return std::find(boost::begin(r), boost::end(r), value); } int ar[3]; int* p = find(ar, 1); std::vector<int> v; std::vector<int>::iterator it = find(v, 1); 配列やコンテナを同じように扱うための ユーティリティが提供されていた。
48.
Rangeアルゴリズム 2.0では、前項のような Rangeに対するアルゴリズムが提供されている。 const
std::vector<int> v = {3, 1, 4}; boost::sort(v); const std::vector<int> v = {1, 2, 3}; boost::for_each(v, [](int x) { std::cout << x << std::endl; }); const std::vector<int> v = {1, 2, 3}; const std::list<int> ls = {1, 2, 3}; const bool is_same = boost::equal(v, ls); begin()/end()を書かなくてもよくなった。
49.
Rangeアダプタ Rangeに対する複数の操作を合成する 「Rangeアダプタ」も少しだが提供されている。 using
namespace boost::adaptors; const std::vector<int> v = {1, 2, 3, 4, 5}; boost::for_each(v | filtered(is_even) | transformed(to_string), [](const std::string&) { ... }); const std::map<int, std::string> m; boost::for_each(m | map_values, [](const std::string&) { ... }); const std::vector<std::shared_ptr<X>> v; boost::for_each(v | indirected, [](const X&) { ... }); Rangeアダプタの適用にはoperator|()を使用する。
50.
Rangeアダプタの種類
アダプタ 効果 r | filtered(pred) pred(x) == trueとなる要素を抽出する r | transformed(f) 各要素にf(x)を適用する r | map_keys map<T1, T2>, vector<pair<T1, T2> >のよう r | map_values なRangeに対し、map_keysはT1を抽出し、 map_valuesはT2を抽出する r | indirected スマートポインタのRangeへの要素アクセ スを、*pではなくxでアクセス可能にする erc...
51.
遅延評価 r | filtered(pred)
| transformed(f); は、この時点ではRangeの全要素の横断は行われない。 Rangeアダプタは、各要素へのイテレータをラップするような 実装になっているため、以下のような for_each(r | filtered(pred) | transformed(f), ...); アルゴリズムによるイテレータに対する評価が行われたときに filtered : 要素の読み飛ばし transformed : 要素への関数適用 が行われる。 そのため、このRangeに対する複数の操作は一度のループで 実行される。
52.
Rangeまとめ • Range Algorithmで、STLアルゴリズムがより使いやすくな
りました。 • Rangeアダプタで、より抽象的なプログラミングが可能に なり、C++で遅延評価のリスト処理ができるようになりま した。 • でもまだまだ、Rangeアダプタが足りない。Ovenが強力で す。 • ドキュメント http://www.boost.org/libs/range/doc/html/index.html
53.
Final Chapter
Under Construction
54.
未来のお話 Boost候補として開発されているライブラリを いくつか紹介します。 1. Mirror 2. STM 3.
LA
55.
Mirror
リフレクションのライブラリ。 コンパイル時、実行時で有用なメタ情報を取得できる。 struct info_printer { template <class IterInfo> void operator()(IterInfo) const { std::cout << IterInfo::type::full_name() << std::endl; } }; template <typename T> void print_info() { using namespace boost::mirror; typedef BOOST_MIRRORED_CLASS(T) meta_X; std::cout << meta_X::full_name() << std::endl; // std::string std::cout << meta_X::base_name() << std::endl; // string mp::for_each_ii< class_layout<meta_X> >(info_printer()); // メンバ列挙… } print_info<std::string>();
56.
STM Software
Transactional Memoryのライブラリ。 Lock/Unlock版のGCみたいなもの。 ロックして即処理、ではなくトランザクションによって 管理するため、より高速で、ロックを行う他の処理とも 合成できる。 boost::stm::tx::object<int> counter(0); int increment() { BOOST_STM_TRANSACTION { return counter++; } BOOST_STM_END_TRANSACTION; }
57.
LA 新たな線形代数ライブラリ。 N次元のベクトル等に対して、operator|()による統一的な アクセス方法を提供する。 また、vector_traitsをユーザー定義型で特殊化することで、 LAのベクトル、行列として簡単に扱うことができる。 struct float3 {
float a[3]; }; namespace boost { namespace la { template <> struct vector_traits<float3> { ... }; }} float3 v; v|X = 0; v|Y = 0; v|Z = 7; float vmag = magnitude(v); float3 m = rotx_matrix<3>(3.14159f); float3 vrot = m * v;
58.
UnderConstructionまとめ • 夢のようなライブラリがたくさん作られてます • ただ、レビューマネージャー不足でなかなかリリース
できないのが現状 • 自分が得意な分野のライブラリがレビューキューに あったら、ぜひレビューマネージャーに立候補してく ださい!
59.
全体まとめ • Boostの日本語翻訳プロジェクトや稲葉さんの
本などで騒がれていたのは1.32.0~1.34.0。 • 最新のBoostはさらなる進化を遂げており、 Boostがあればたいていのことはできます。 • ぜひ仕事でも採用しましょう。 自分で作るよりバグが少なく、多くのユーザー に使われてますよ。
Download now