SlideShare a Scribd company logo
1 of 59
Download to read offline
Boostのあるプログラミング生活



                  高橋晶(Akira Takahashi)

    ブログ:「Faith and Brave – C++で遊ぼう」
     http://d.hatena.ne.jp/faith_and_brave/
                     わんくま横浜勉強会 2010/08/28(土)
宣伝コーナー
 プログラミング雑誌
 (ライクな書籍)を始めました。


タイトルは

プログラミングの魔導書
~Programmers’ Grimoire~
です。



書籍版は完全受注生産のためすでに締め
切りましたが、PDF版は購入可能です。
http://longgate.co.jp/products.html
はじめに

Boostによって、C++でのプログラミングは
かなり容易で、強力なものとなりました。

今回は、Boost 1.43.0時点でのとくに強力で、
私が好んで使用しているライブラリを紹介します。
アジェンダ


1.   MultiIndex
2.   Spirit.Qi
3.   PropertyTree
4.   Range 2.0
5.   Under Construction
Chapter 1


      Multi Index
            統合データ構造
MultiIndexとは何か



複数のインデックスを持てるコンテナ!

        組み合わせは自由自在!
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 >>
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 >>
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>()
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 >>
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>()
End of Introduction




あとはインデックスの種類と組み合わせだけ!
提供されているインデックス


      インデックス                     対応するコンテナ
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
活用例 1/4
複数のキーを持つ辞書




                  Next >>
活用例 2/4
 こんな構造体があるとして


struct file {
    std::string   name;
    std::size_t   size;
    file_kind     kind;
    datetime      update_date;
};




                                 Next >>
活用例 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 >>
活用例 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()) {
    ...
}
まとめ
• 応用範囲はとても広い

• 実装の話はしませんが、効率は自分で作るより数
  万倍いいです。

 そのへんの話はk.inabaさんのセッションをみてくだ
 さい:
 http://www.ustream.tv/recorded/2968920

• ドキュメント
 http://www.boost.org/libs/multi_index/doc/index.html
アドバイス


分割統治しましょう。

じゃないとコード量が爆発します。

Typedef Templateとか覚えておくといいです。
Chapter 2


            Spirit.Qi
                  構文解析DSEL
はじめに




自前の構文解析してたりしませんか?
はじめに




文字列のfind関数とか使ってませんか?
はじめに




1文字ずつ自分で解析したりしてませんか?
はじめに




そんな自前の構文解析から卒業できます。
      そう、Qiならね。
Qiとは何か


• Boost.Spiritの構文解析ライブラリであり、
  DSEL(Domain Specific Enbedded Language :
          ドメイン特化組み込み言語)

• Qiの読みは「キ」。気です。
  私は「キューアイ」と読んでるのでそれでいき
  ます。
まず下準備
こんなの用意しておきます。
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;
カッコの中身を取り出してみる
 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行!
データ型パーサー


          パーサー              型(マッチする例)
int_             int(123)
double_          double(3.14)
bin              unsigned int(0101)
hex              unsigned int(1a)
char_            char(a)
auto_            自動的に推論
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
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
型が異なるシーケンスの場合
  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)
パーサー演算子


        演算子                説明
>>            シーケンス。
              Fusionのシーケンスを返す。
*a            0回以上の繰り返し。
              std::vector<A>, std::stringを返す。
a%b           b区切りの1回以上の繰り返し。
              std::vector<A>を返す。
a – b         差。bではない間。
パーサーディレクティブ


            演算子           説明
omit[a]           aのパースは行うが結果はいら
                  ない。
repeat[a]         パースに成功する限り、aパー
                  サーを繰り返す。
                  std::vector<A>を返す。
repeat(N)[a]      N回aパーサーを繰り返す。
                  std::vector<A>を返す。
パーサーディレクティブの例 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
パーサーディレクティブの例 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
最後の例 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のシーケンスとしてアダプトする機能がある
最後の例 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
話さなかったこと

•   セマンティックアクション
•   Spirit.Phoenixとの連携
•   文字コードの扱いほげほげ
•   イテレータによる遅延パース
•   エラー処理
まとめ


• Spirit.Qiは簡単かつ強力です。
• 構造体へも一発パースできます。
• 読めます。

• ドキュメント
 http://www.boost.org/libs/spirit/doc/html/spirit/qi.
 html
Chapter 3


   Property Tree
            ツリー構造の汎用プロパティ管理
PropertyTreeとは


• ツリー構造への一般的なアクセス方法を提供
  するライブラリ

• 使用する型はboost::property_tree::ptree

• 待望のXMLパーサー、JSONパーサー搭載
 (他にも、INFOとINIのパーサーがある)
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");
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");
さらっとまとめと注意事項
• XMLパーサーがやっと入りました。

• XPathじゃなくPropertyTreeの独自構文によるアクセ
  スなので注意。

• ptree::getは失敗時に例外投げる。
  boost::optionalを返すptree::get_optionalもあります。

• ドキュメント
  http://www.boost.org/doc/html/property_tree.html
Chapter 4


       Range 2.0
            Adaptor & Algorithms
Boost.Range 2.0



            Boost 1.43.0で、
Boost.Rangeのバージョンが2.0になりました。
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);

 配列やコンテナを同じように扱うための
 ユーティリティが提供されていた。
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()を書かなくてもよくなった。
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|()を使用する。
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...
遅延評価
r | filtered(pred) | transformed(f);

 は、この時点ではRangeの全要素の横断は行われない。

 Rangeアダプタは、各要素へのイテレータをラップするような
 実装になっているため、以下のような
for_each(r | filtered(pred) | transformed(f), ...);

  アルゴリズムによるイテレータに対する評価が行われたときに
  filtered : 要素の読み飛ばし
  transformed : 要素への関数適用
  が行われる。
  そのため、このRangeに対する複数の操作は一度のループで
  実行される。
Rangeまとめ
• Range Algorithmで、STLアルゴリズムがより使いやすくな
  りました。

• Rangeアダプタで、より抽象的なプログラミングが可能に
  なり、C++で遅延評価のリスト処理ができるようになりま
  した。

• でもまだまだ、Rangeアダプタが足りない。Ovenが強力で
  す。

• ドキュメント
  http://www.boost.org/libs/range/doc/html/index.html
Final Chapter

   Under Construction
未来のお話

Boost候補として開発されているライブラリを
いくつか紹介します。

1. Mirror
2. STM
3. LA
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>();
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;
}
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;
UnderConstructionまとめ
• 夢のようなライブラリがたくさん作られてます

• ただ、レビューマネージャー不足でなかなかリリース
  できないのが現状

• 自分が得意な分野のライブラリがレビューキューに
  あったら、ぜひレビューマネージャーに立候補してく
  ださい!
全体まとめ

• Boostの日本語翻訳プロジェクトや稲葉さんの
  本などで騒がれていたのは1.32.0~1.34.0。

• 最新のBoostはさらなる進化を遂げており、
  Boostがあればたいていのことはできます。

• ぜひ仕事でも採用しましょう。
  自分で作るよりバグが少なく、多くのユーザー
  に使われてますよ。

More Related Content

What's hot

中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexprGenya Murakami
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニックGenya Murakami
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するYoshifumi Kawai
 
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー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が導入されてうれしいので紹介します」Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Hiro H.
 
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理DADA246
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計Yoshinori Matsunobu
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021Atsushi Nakamura
 
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Keisuke Fukuda
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールMITSUNARI Shigeo
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと信之 岩永
 
【Unity】 Behavior TreeでAIを作る
 【Unity】 Behavior TreeでAIを作る 【Unity】 Behavior TreeでAIを作る
【Unity】 Behavior TreeでAIを作るtorisoup
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装MITSUNARI Shigeo
 
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法Yoshifumi Kawai
 
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しようUnity Technologies Japan K.K.
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門Fixstars Corporation
 

What's hot (20)

中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニック
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー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が導入されてうれしいので紹介します」Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
 
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
C#で速度を極めるいろは
C#で速度を極めるいろはC#で速度を極めるいろは
C#で速度を極めるいろは
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021
 
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
 
C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと
 
【Unity】 Behavior TreeでAIを作る
 【Unity】 Behavior TreeでAIを作る 【Unity】 Behavior TreeでAIを作る
【Unity】 Behavior TreeでAIを作る
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
 
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
 
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
 
LLVM最適化のこつ
LLVM最適化のこつLLVM最適化のこつ
LLVM最適化のこつ
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 

Viewers also liked

闇魔術を触ってみた
闇魔術を触ってみた闇魔術を触ってみた
闇魔術を触ってみたSatoshi Sato
 
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)Yuki Tamura
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会Akihiko Matuura
 
Template Meta Programming入門から応用まで
Template Meta Programming入門から応用までTemplate Meta Programming入門から応用まで
Template Meta Programming入門から応用までyoshihikoozaki5
 

Viewers also liked (7)

C++ Presentation
C++ PresentationC++ Presentation
C++ Presentation
 
闇魔術を触ってみた
闇魔術を触ってみた闇魔術を触ってみた
闇魔術を触ってみた
 
C++14 Overview
C++14 OverviewC++14 Overview
C++14 Overview
 
C++の黒魔術
C++の黒魔術C++の黒魔術
C++の黒魔術
 
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
 
Template Meta Programming入門から応用まで
Template Meta Programming入門から応用までTemplate Meta Programming入門から応用まで
Template Meta Programming入門から応用まで
 

Similar to Boostのあるプログラミング生活

C++模板与泛型编程
C++模板与泛型编程C++模板与泛型编程
C++模板与泛型编程deer hope
 
C++模板与泛型编程
C++模板与泛型编程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)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
 
Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013
Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013
Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013Moscow.pm
 
Lecture7
Lecture7Lecture7
Lecture7orgil
 
Javaバイトコード入門
Javaバイトコード入門Javaバイトコード入門
Javaバイトコード入門Kota Mizushima
 
ADO.NET Entity Framework 4
ADO.NET Entity Framework 4ADO.NET Entity Framework 4
ADO.NET Entity Framework 4Raffaele Fanizzi
 
帰って来たNemerle
帰って来たNemerle帰って来たNemerle
帰って来たNemerleKota 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...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 DetailsMongoDB Indexing: The Details
MongoDB Indexing: The DetailsMongoDB
 
Aspetos gerais de desenvolvimento web.
Aspetos gerais de desenvolvimento web.Aspetos gerais de desenvolvimento web.
Aspetos gerais de desenvolvimento web.Corcioli
 
Вебинар Томулевича materialized.path 2
Вебинар Томулевича materialized.path 2 Вебинар Томулевича materialized.path 2
Вебинар Томулевича materialized.path 2 Media Gorod
 
Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储 Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储 zhen chen
 
N03 app engineseminar
N03 app engineseminarN03 app engineseminar
N03 app engineseminarSun-Jin Jang
 
Entity+framework+
Entity+framework+Entity+framework+
Entity+framework+Rey zhang
 
Lecture9
Lecture9Lecture9
Lecture9orgil
 
UglifyJS 使用文档
UglifyJS 使用文档UglifyJS 使用文档
UglifyJS 使用文档明 李
 
Lecture6
Lecture6Lecture6
Lecture6orgil
 

Similar to Boostのあるプログラミング生活 (20)

C++模板与泛型编程
C++模板与泛型编程C++模板与泛型编程
C++模板与泛型编程
 
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)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-CTICClase5_Python-CTIC
Clase5_Python-CTIC
 
Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013
Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013
Преобразование Perl-структур в XML. Трефилова Екатерина. Moscow.pm 6 июля 2013
 
Lecture7
Lecture7Lecture7
Lecture7
 
Javaバイトコード入門
Javaバイトコード入門Javaバイトコード入門
Javaバイトコード入門
 
ADO.NET Entity Framework 4
ADO.NET Entity Framework 4ADO.NET Entity Framework 4
ADO.NET Entity Framework 4
 
帰って来たNemerle
帰って来たNemerle帰って来た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...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 DetailsMongoDB Indexing: The Details
MongoDB Indexing: The Details
 
Türsteher für Bohnen
Türsteher für BohnenTürsteher für Bohnen
Türsteher für Bohnen
 
Aspetos gerais de desenvolvimento web.
Aspetos gerais de desenvolvimento web.Aspetos gerais de desenvolvimento web.
Aspetos gerais de desenvolvimento web.
 
Вебинар Томулевича materialized.path 2
Вебинар Томулевича materialized.path 2 Вебинар Томулевича materialized.path 2
Вебинар Томулевича materialized.path 2
 
Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储 Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储
 
N03 app engineseminar
N03 app engineseminarN03 app engineseminar
N03 app engineseminar
 
Entity+framework+
Entity+framework+Entity+framework+
Entity+framework+
 
Lecture9
Lecture9Lecture9
Lecture9
 
UglifyJS 使用文档
UglifyJS 使用文档UglifyJS 使用文档
UglifyJS 使用文档
 
Lecture6
Lecture6Lecture6
Lecture6
 

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のあるプログラミング生活