SlideShare a Scribd company logo
1 of 49
Download to read offline
Boost.Geometryに学ぶ
テンプレートライブラリの設計


            高橋 晶(Akira Takahashi)
               id:faith_and_brave
                       @cpp_akira
        Boost.勉強会 #6 札幌 2011/11/05(土)
自己紹介
•   株式会社ロングゲート 取締役
•   C++標準化委員会エキスパートメンバ
•   Boost Geometry Libraryコントリビュータ
•   boostjpコミュニティ マネージャ
•   著書 『C++テンプレートテクニック』
•   『プログラミングの魔導書』 編集長
この発表について
• 今回の発表では、
 – Boost.Geometryがどのような使い方ができ、
 – どのような設計になっているのかを知り、
 – こういったライブラリをどうすれば作れるのか
 を見ていきます。
話すこと




1. Boost Geometry Libraryとは
2. ジェネリックプログラミング
3. Concept-based Design
Chapter 01
Boost Geometry Libraryとは
           What's Boost.Geometry?
Boost Geometry Library
• Boost Geometry Libraryは、計算幾何のためのライブラリ
• 作者:Barend Gehrels
• Boost 1.47.0でリリースされた。
特徴1. ジェネリック 1/3
 Boost.Geometryのアルゴリズムは、
 複数のモデルに対して動作する。
const linestring a = assign::list_of<point>(0, 2)(2, 2);
const linestring b = assign::list_of<point>(1, 0)(1, 4);

// 2つの線が交わっているか
const bool result = geometry::intersects(a, b);
BOOST_ASSERT(result);
特徴1. ジェネリック 2/3
 Boost.Geometryのアルゴリズムは、
 複数のモデルに対して動作する。
polygon a, b;
geometry::exterior_ring(a) =
    assign::list_of<point>(0, 0)(3, 3)(0, 3)(0, 0);

geometry::exterior_ring(b) =
    assign::list_of<point>(1.5, 1.5)(4.5, 4.5)(1.5, 4.5)(1.5, 1.5);

// 2つのポリゴンが交わっているか
const bool result = geometry::intersects(a, b);
BOOST_ASSERT(result);
特徴1. ジェネリック 3/3
 Boost.Geometryのアルゴリズムは、
 複数のモデルに対して動作する。
const box a(point(0, 0),     point(3, 3));
const box b(point(1.5, 1.5), point(4.5, 4.5));

// 2つの四角形が交わっているか
const bool result = geometry::intersects(a, b);
BOOST_ASSERT(result);
特徴2. アダプト機構 1/2
 Boost.Geometryの各モデルは、ユーザー定義型に適用できる
 ため、Boost.Geometryのアルゴリズムを他のライブラリの型に
 対して使用することができる。

struct Point {
  int x, y;

  Point() : x(0), y(0) {}
  Point(int x, int y) : x(x), y(y) {}
};

struct Rect {
  int left, top, right, bottom;

  Rect() : left(0), top(0), right(0), bottom(0) {}
  Rect(int left, int top, int right, int bottom)
    : left(left), top(top), right(right), bottom(bottom) {}
};
特徴2. アダプト機構 2/2
 Boost.Geometryの各モデルは、ユーザー定義型に適用できる
 ため、Boost.Geometryのアルゴリズムを他のライブラリの型に
 対して使用することができる。

BOOST_GEOMETRY_REGISTER_POINT_2D(Point, int, cs::cartesian, x, y);
BOOST_GEOMETRY_REGISTER_BOX_2D_4VALUES(Rect, Point, left, top, right,
bottom);

const Point p(1, 1);
const Rect box(0, 0, 2, 2);

// 点が四角形の内側にあるか
const bool result = geometry::within(p, box);
BOOST_ASSERT(result);
Boost.Geometryの設計
• Boost.Geometryの設計は、
  1.   あらゆるモデルに対して同じアルゴリズムを適用でき、
  2.   他のライブラリのモデルに対してBoost.Geometryのアルゴリズムを
       適用できる。


• この発表では、このような設計のライブラリをどうやって作る
  のかを見ていく。
Chapter 02
ジェネリックプログラミング
       Generic Programming
ジェネリックプログラミングとは
• データ型に依存しないプログラミング手法。

• C++では、テンプレートという、パラメタライズドタイプの機能
  によって実現する。

• オブジェクト指向的なライブラリは、継承関係にあるデータを
  扱うが、テンプレートによって設計されたライブラリは、継承
  関係に依存せずにあらゆるデータを扱う設計が可能となる。
データ型に依存しないアルゴリズム
 以下のmin関数は、operator<が使用できる
 あらゆる型で振る舞う関数


template <class T>
T min(T a, T b)
{
  return a < b ? a : b;
}


int    x = min(1, 2);     // Tはintに置き換えられる
double d = min(1.0, 2.0); // Tはdoubleに置き換えられる
char   c = min('1', '1'); // Tはcharに置き換えられる
あらゆるデータ型を保持できるコンテナ 1/2

 以下のListクラスは、あらゆるデータ型を保持できるコンテナ
template <class T>
class List {
  T* data_;
  size_t size_;
public:
  …
  void add(const T& x)
  {
    T* tmp = new T[size_ + 1];
    for (size_t i = 0; i < size_; ++i) { tmp[i] = data_[i]; }
    delete[] data_;

      data_ = tmp;
      data_[size_++] = x;
  }

  T& operator[](size_t i) { return data_[i]; }
  size_t size() const { return size_; }
};
あらゆるデータ型を保持できるコンテナ 2/2

 以下のListクラスは、あらゆるデータ型を保持できるコンテナ
List<int> ls;
ls.add(3);
ls.add(1);
ls.add(4);

for (size_t i = 0; i < ls.size(); ++i) {
  cout << ls[i] << endl;
}

List<string> ls;
ls.add("abc");
ls.add("hello");
ls.add("goodbye");

for (size_t i = 0; i < ls.size(); ++i) {
  cout << ls[i] << endl;
}
STL
• Alexander Stepanovが設計したSTLは、テンプレートによって、
  データ構造とアルゴリズムの分離を行った。

• これによって、アルゴリズムはあらゆるデータ構造に対して
  振る舞うことが可能になったため、アルゴリズムは誰か一人
  が書けばよくなった。
ジェネリックプログラミングのポイント
• データ型が異なる以外は同じコードになるのであれば、それ
  はジェネリック(汎用的)にできる。

• 型によって最適化を行いたい場合は特殊化することができる。

• ジェネリックプログラミングによるコードの汎用化は、ユー
  ザーコード量を限りなく減らすことができる。
Chapter 03
コンセプトに基づく設計
      Concept-based Design
コンセプトという考え方 1/2
• Boost.Geometryには、Point, LineString, Polygon, Boxなどの
  「コンセプト」と呼ばれる分類が存在する。

• これらコンセプトは、class point; のような具体的な型ではなく、
  「Pointと見なせるあらゆる型」を意味する。

• Boost.GeometryはPointコンセプトを満たす型として
  boost::geometry::model::d2::point_xy<T>という2次元の点を
  表す型を提供している。

• Boost.Geometryでは、point_xyという型だけでなく、
  その他のユーザーが定義した型を、Pointコンセプトの型とし
  ても扱うことができる。
コンセプトという考え方 2/2
これらのPointコンセプトを満たす型は継承関係にある必要は
ないし、インタフェースも異なるが、同じように扱うことができる。


polygon<point_xy<double>> poly;
double result = area(poly);

polygon<std::pair<double, double>> poly;
double result = area(poly);

polygon<UserDefinedPointType> poly;
double result = area(poly);
コンセプトという考え方 2/2
これらのPointコンセプトを満たす型は継承関係にある必要は
ないし、インタフェースも異なるが、同じように扱うことができる。


polygon<point_xy<double>> poly;            template <class T>
double result = area(poly);                struct point_xy {
                                              T values[2];
polygon<std::pair<double, double>> poly;   };
double result = area(poly);

polygon<UserDefinedPointType> poly;
double result = area(poly);
コンセプトという考え方 2/2
これらのPointコンセプトを満たす型は継承関係にある必要は
ないし、インタフェースも異なるが、同じように扱うことができる。


polygon<point_xy<double>> poly;
double result = area(poly);

polygon<std::pair<double, double>> poly;   template <class T1, class T2>
double result = area(poly);                struct pair {
                                              T1 first;
polygon<UserDefinedPointType> poly;           T2 second;
double result = area(poly);                };
コンセプトという考え方 2/2
これらのPointコンセプトを満たす型は継承関係にある必要は
ないし、インタフェースも異なるが、同じように扱うことができる。


polygon<point_xy<double>> poly;
double result = area(poly);

polygon<std::pair<double, double>> poly;
double result = area(poly);

polygon<UserDefinedPointType> poly;        struct UserDefinedPointType {
double result = area(poly);                   ????
                                           };
コンセプトという考え方 2/2
これらのPointコンセプトを満たす型は継承関係にある必要は
ないし、インタフェースも異なるが、同じように扱うことができる。


polygon<point_xy<double>> poly;
double result = area(poly);

polygon<std::pair<double, double>> poly;
double result = area(poly);                Point Concept

polygon<UserDefinedPointType> poly;
double result = area(poly);



   こういった設計はどうやったら実現できるのかを紹介する
Pointコンセプトの作り方 1/5
 通常、点を表すクラスは以下のように定義することになる:

template <class T>
struct point {
   T x, y;
};
Pointコンセプトの作り方 2/5
 コンセプトベースなライブラリの場合は、以下のようにアダプト
 可能なインタフェースとして定義する:
template <class T>
struct point_traits {
  typedef typename T::value_type value_type;

  static value_type get_x(const T& p) { return p.x; }
  static value_type get_y(const T& p) { return p.y; }

  static T construct(value_type x_, value_type y_)
    { return T(x_, y_); }

  static T substract(const T& a, const T& b)
    { return construct(a.x - b.x, a.y – b.y); }
};
Pointコンセプトの作り方 3/5
 Pointを操作するアルゴリズムは、点のクラスを直接操作せず、
 traitsを通して行う。
template <class Point>
double distance(const Point& a, const Point& b)
{
  const Point d = a – b;
  return std::sqrt(d.x * d.x + d.y * d.y);
}




template <class Point>
double distance(const Point& a, const Point& b)
{
  typedef point_traits<Point> traits;
  const Point d = traits::substract(a, b);
  return std::sqrt(
            traits::get_x(d) * traits::get_x(d) +
            traits::get_y(d) * traits::get_y(d));
}
Pointコンセプトの作り方 4/5
 ユーザー定義の点を表す型をPointコンセプトを満たすようにア
 ダプトする:
struct my_point {
   double data[2];
};

template <>
struct point_traits<my_point> {
  typedef double value_type;

  static value_type get_x(const my_point& p) { return p.data[0]; }
  static value_type get_y(const my_point& p) { return p.data[1]; }

  static my_point construct(double x, double y)
    { my_point p = {x, y}; return p; }

  static my_point substract(const my_point& a, const my_point& b)
    { return constrcut(a[0] – b[0], a[1] – b[1]); }
};
Pointコンセプトの作り方 5/5
 これで、distanceアルゴリズムは、point_traitsでアダプトしたあら
 ゆる型で振る舞うことができるようになる。
my_point p = { 0.0, 0.0 };
my_point q = { 3.0, 3.0 };

double d = distance(p, q); // 4.24



  コンセプトベースライブラリを作る基本的な流れ:
  1. 具体的な型を直接操作しない
  2. アダプト可能なインタフェースを定義する
  3. アルゴリズムでは、traitsを通して間接的に操作を行う
  4. ユーザー定義型をtraitsにアダプトする
コンセプトでオーバーロードする 1/9

Boost.Geometryは複数のコンセプトをサポートしているので、
アルゴリズムはコンセプトごとに最適な実装を選択させる必要
がある。
実現したいこと:

template <class Point, class Point>
double distance(Point, Point);

template <class Point, class LineString>
double distance(Point, LineString);

template <class LineString, class Point>
double distance(LineString, Point);


これを実現するには、「タグディスパッチ」という手法を用いる。
コンセプトでオーバーロードする 2/9

 まず、PointコンセプトとLineStringコンセプト、それぞれのための
 タグを定義する。
 タグは単なる空のクラス。

struct point_tag {};
struct line_string_tag {};
コンセプトでオーバーロードする 3/9

 タグを返すメタ関数を用意する。
 中身なし。


template <class T>
class get_tag;
コンセプトでオーバーロードする 4/9

 ユーザー定義の型をアダプトする際に、get_tagを特殊化する。



template <>
struct get_tag<my_point> {
   typedef point_tag type;
};

template <>
struct get_tag<my_line> {
   typedef line_string_tag type;
};
コンセプトでオーバーロードする 5/9

 アルゴリズムはあらゆる型を受け取れるようにし、
 型のタグを取得して専門特化した関数に転送する。


template <class Geometry1, class Geometry2>
double distance(const Geometry1& a, const Geometry2& b)
{
  return distance(a, b,
            typename get_tag<Geometry1>::type(),
            typename get_tag<Geometry2>::type());
}
コンセプトでオーバーロードする 6/9

 組み合わせごとのアルゴリズムを定義する



// 点と点
template <class Point>
double distance(const Point& a, const Point& b,
                point_tag, point_tag)
{
  typedef point_traits<Point> traits;
  const Point d = traits::substract(a, b);
  return std::sqrt(
            traits::get_x(d) * traits1::get_x(d) +
            traits::get_y(d) * traits2::get_y(d));
}
コンセプトでオーバーロードする 7/9

 組み合わせごとのアルゴリズムを定義する

// 点と線
template <class Point, class LineString>
double distance(const Point& a, const LineString& b,
                 point_tag, line_string_tag)
{
  typedef line_string_traits<LineString> traits;
  return std::min(
             distance(a, traits::get_start(b)),
             distance(a, traits::get_last(b))
          );
}

// 線と点
template <class LineString, class Point>
double distance(const LineString& a, const Point& b,
                line_string_tag, point_tag)
{ return distance(b, a); }
コンセプトでオーバーロードする 8/9

 これで、PointとLineStringの組み合わせごとに最適な実装を切り
 替えることができるようになった。

// 点と点
my_point p = {0.0, 0.0};
my_point q = {3.0, 3.0};

double d = distance(p, q);

// 点と線
my_point p = {0.0, 0.0};
my_line l = {{2.0, 2.0}, {3.0, 3.0}};

double d = distance(p, l); // 逆もできる : distance(l, p);
コンセプトでオーバーロードする 9/9

コンセプトでオーバーロードする流れ:

1. コンセプトを表すタグを定義する。タグは単なる空のクラス
2. 型を受け取ってタグを返すメタ関数を定義する
3. タグを返すメタ関数を、型ごとに特殊化する
4. 関数テンプレートのテンプレートパラメータを、
   タグを返すメタ関数に渡し、結果の型を転送する
5. タグをパラメータにとるオーバーロードを用意する
Concept-basedライブラリの例
• Boost.Graph
  抽象化が難しいと言われるグラフにおいて、データ構造とア
  ルゴリズムをSTLの概念に基づいて分離したライブラリ。
  特性別にグラフ構造を分類するのにコンセプトを採用してい
  る。

• Boost.Fusion
  タプルを異なる型のシーケンスと見なしイテレート可能にした
  ライブラリ。
  Fusion Sequenceというコンセプトにアダプトされたあらゆる型
  を、Fusionのタプルと見なして数々のアルゴリズムを適用す
  ることができる。
まとめ
• Boost.Geometryは、有用なアルゴリズムを提供するだけでは
  なく、既存の他のライブラリと組み合わせて使用することを想
  定して設計されている。
  そういった設計には、コンセプトという考えを導入すると拡張
  性が高くなる。

• データとアルゴリズムを分離したことで誰か一人がアルゴリ
  ズムを書けばいいなら、みんなで知恵を絞ることで、そのライ
  ブラリを使用している全てのソフトウェアが改善されることを
  期待できる。

• 今回の話をふまえて、ぜひテンプレートライブラリを作ってみ
  てください!
Appendix
アルゴリズムとモデル一覧
       Algorithm and Model List
アルゴリズム一覧 1/5
関数            説明             図
area          面積を求める
centroid      図形の中心点を求める




convex_hull   凸包を求める




correct       図形の向きを修正し、終了
              点を補完する
アルゴリズム一覧 2/5
関数           説明             図

difference   2つの図形の差異を求める




disjoint     2つの図形が互いに素か判
             定する
distance     2つの図形の距離を求める
envelope     包絡線を求める




equals       2つの図形が等しいか判定
             する
アルゴリズム一覧 3/5
関数             説明              図

expand         他の図形でboxを拡張する
for_each_point   図形を走査する
for_each_segment
intersection   2つの図形の共通部分を
               求める




intersects     2つの図形が交わっている
               か判定する
length         図形の長さを求める
perimeter
overlaps       2つの図形が重なっている
               かを判定する
アルゴリズム一覧 4/5
関数          説明            図

reverse     図形を逆向きにする
simplify    図形を簡略化する




transform   図形の単位変換などを行
            う
union_      2つの図形の和を求める
アルゴリズム一覧 5/5
関数       説明            図

unique   図形内の重複を削除する
within   図形がもう一方の図形の
         内側にあるか判定する
モデル一覧


モデル                説明

Point              N次元の点
LineString         複数の線分
Polygon            三角形(メッシュ構造)
Box                四角形
Ring               輪
Segment            線分
MultiPoint         複数の点
MultiLineString    複数の線
MultiPolygon       複数の三角形

More Related Content

What's hot

C++ Template Metaprogramming
C++ Template MetaprogrammingC++ Template Metaprogramming
C++ Template MetaprogrammingAkira Takahashi
 
オブジェクト指向入門5
オブジェクト指向入門5オブジェクト指向入門5
オブジェクト指向入門5Kenta Hattori
 
Lambda in template_final
Lambda in template_finalLambda in template_final
Lambda in template_finalCryolite
 
C++0x 言語の未来を語る
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語るAkira Takahashi
 
[第2版]Python機械学習プログラミング 第8章
[第2版]Python機械学習プログラミング 第8章[第2版]Python機械学習プログラミング 第8章
[第2版]Python機械学習プログラミング 第8章Haruki Eguchi
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会Akihiko Matuura
 
初心者講習会資料(Osaka.R#7)
初心者講習会資料(Osaka.R#7)初心者講習会資料(Osaka.R#7)
初心者講習会資料(Osaka.R#7)Masahiro Hayashi
 
Object oriented-01
Object oriented-01Object oriented-01
Object oriented-01Osam Tmu
 
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しようC# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しようFujio Kojima
 
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らないdigitalghost
 
C++0xの概要(デブサミ2010)
C++0xの概要(デブサミ2010)C++0xの概要(デブサミ2010)
C++0xの概要(デブサミ2010)Akira Takahashi
 
多相な関数の定義から学ぶ、型クラスデザインパターン
多相な関数の定義から学ぶ、型クラスデザインパターン多相な関数の定義から学ぶ、型クラスデザインパターン
多相な関数の定義から学ぶ、型クラスデザインパターンTaisuke Oe
 
圏論とプログラミング読書会#2 資料
圏論とプログラミング読書会#2 資料圏論とプログラミング読書会#2 資料
圏論とプログラミング読書会#2 資料53ningen
 
templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論MITSUNARI Shigeo
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性Hibiki Yamashiro
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプKohsuke Yuasa
 
エラーハンドリング
エラーハンドリングエラーハンドリング
エラーハンドリング道化師 堂華
 

What's hot (20)

C++ Template Metaprogramming
C++ Template MetaprogrammingC++ Template Metaprogramming
C++ Template Metaprogramming
 
オブジェクト指向入門5
オブジェクト指向入門5オブジェクト指向入門5
オブジェクト指向入門5
 
Lambda in template_final
Lambda in template_finalLambda in template_final
Lambda in template_final
 
C++0x 言語の未来を語る
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語る
 
[第2版]Python機械学習プログラミング 第8章
[第2版]Python機械学習プログラミング 第8章[第2版]Python機械学習プログラミング 第8章
[第2版]Python機械学習プログラミング 第8章
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
 
初心者講習会資料(Osaka.R#7)
初心者講習会資料(Osaka.R#7)初心者講習会資料(Osaka.R#7)
初心者講習会資料(Osaka.R#7)
 
Object oriented-01
Object oriented-01Object oriented-01
Object oriented-01
 
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しようC# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
 
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
 
C++0xの概要(デブサミ2010)
C++0xの概要(デブサミ2010)C++0xの概要(デブサミ2010)
C++0xの概要(デブサミ2010)
 
C++ template-primer
C++ template-primerC++ template-primer
C++ template-primer
 
C++0x総復習
C++0x総復習C++0x総復習
C++0x総復習
 
多相な関数の定義から学ぶ、型クラスデザインパターン
多相な関数の定義から学ぶ、型クラスデザインパターン多相な関数の定義から学ぶ、型クラスデザインパターン
多相な関数の定義から学ぶ、型クラスデザインパターン
 
圏論とプログラミング読書会#2 資料
圏論とプログラミング読書会#2 資料圏論とプログラミング読書会#2 資料
圏論とプログラミング読書会#2 資料
 
templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
dezainn
dezainndezainn
dezainn
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
 
エラーハンドリング
エラーハンドリングエラーハンドリング
エラーハンドリング
 

Viewers also liked

テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式digitalghost
 
A Hole in One: Courtney Love Charms #CannesLions #OgilvyCannes
A Hole in One: Courtney Love Charms #CannesLions #OgilvyCannes A Hole in One: Courtney Love Charms #CannesLions #OgilvyCannes
A Hole in One: Courtney Love Charms #CannesLions #OgilvyCannes Ogilvy
 
Презентация проекта Аргус-М
Презентация проекта Аргус-МПрезентация проекта Аргус-М
Презентация проекта Аргус-Мkulibin
 
Sirje Tamm - Muutused haridusmaastikul õpetaja pilgu läbi
Sirje Tamm - Muutused haridusmaastikul õpetaja pilgu läbiSirje Tamm - Muutused haridusmaastikul õpetaja pilgu läbi
Sirje Tamm - Muutused haridusmaastikul õpetaja pilgu läbilepakas
 
BWB Meetup: Storm - distributed realtime computation system
BWB Meetup: Storm - distributed realtime computation systemBWB Meetup: Storm - distributed realtime computation system
BWB Meetup: Storm - distributed realtime computation systemAndrii Gakhov
 
Тонкости email-маркетинга на крупных проектах
Тонкости email-маркетинга на крупных проектахТонкости email-маркетинга на крупных проектах
Тонкости email-маркетинга на крупных проектахPromodo
 
Using Social Media For Commodity Affiliate Programs
Using Social Media For Commodity Affiliate ProgramsUsing Social Media For Commodity Affiliate Programs
Using Social Media For Commodity Affiliate ProgramsAffiliate Summit
 
Optimizing task completion times
Optimizing task completion times Optimizing task completion times
Optimizing task completion times Kiran Badam
 
Steam Eye Mask help you solve eye problem
Steam Eye Mask help you solve eye problemSteam Eye Mask help you solve eye problem
Steam Eye Mask help you solve eye problemSelina Li
 
Information Literacy in Higher Education
Information Literacy in Higher EducationInformation Literacy in Higher Education
Information Literacy in Higher EducationHELIGLIASA
 

Viewers also liked (20)

テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式
 
Bjarne dont speaking
Bjarne dont speakingBjarne dont speaking
Bjarne dont speaking
 
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_58_0 merge
Boost Tour 1_58_0 mergeBoost Tour 1_58_0 merge
Boost Tour 1_58_0 merge
 
Study3 boost
Study3 boostStudy3 boost
Study3 boost
 
A Hole in One: Courtney Love Charms #CannesLions #OgilvyCannes
A Hole in One: Courtney Love Charms #CannesLions #OgilvyCannes A Hole in One: Courtney Love Charms #CannesLions #OgilvyCannes
A Hole in One: Courtney Love Charms #CannesLions #OgilvyCannes
 
Презентация проекта Аргус-М
Презентация проекта Аргус-МПрезентация проекта Аргус-М
Презентация проекта Аргус-М
 
Zaragoza turismo 239
Zaragoza turismo 239Zaragoza turismo 239
Zaragoza turismo 239
 
Sirje Tamm - Muutused haridusmaastikul õpetaja pilgu läbi
Sirje Tamm - Muutused haridusmaastikul õpetaja pilgu läbiSirje Tamm - Muutused haridusmaastikul õpetaja pilgu läbi
Sirje Tamm - Muutused haridusmaastikul õpetaja pilgu läbi
 
BWB Meetup: Storm - distributed realtime computation system
BWB Meetup: Storm - distributed realtime computation systemBWB Meetup: Storm - distributed realtime computation system
BWB Meetup: Storm - distributed realtime computation system
 
Тонкости email-маркетинга на крупных проектах
Тонкости email-маркетинга на крупных проектахТонкости email-маркетинга на крупных проектах
Тонкости email-маркетинга на крупных проектах
 
Using Social Media For Commodity Affiliate Programs
Using Social Media For Commodity Affiliate ProgramsUsing Social Media For Commodity Affiliate Programs
Using Social Media For Commodity Affiliate Programs
 
Optimizing task completion times
Optimizing task completion times Optimizing task completion times
Optimizing task completion times
 
Evaluation001
Evaluation001Evaluation001
Evaluation001
 
Steam Eye Mask help you solve eye problem
Steam Eye Mask help you solve eye problemSteam Eye Mask help you solve eye problem
Steam Eye Mask help you solve eye problem
 
Information Literacy in Higher Education
Information Literacy in Higher EducationInformation Literacy in Higher Education
Information Literacy in Higher Education
 
میوه آرایی
میوه آراییمیوه آرایی
میوه آرایی
 
Alliance 0
Alliance 0Alliance 0
Alliance 0
 
Energia punto de apoyo para el desarrollo
Energia punto de apoyo para el desarrolloEnergia punto de apoyo para el desarrollo
Energia punto de apoyo para el desarrollo
 
Zaragoza turismo 231
Zaragoza turismo 231Zaragoza turismo 231
Zaragoza turismo 231
 

Similar to Learning Template Library Design using Boost.Geomtry

Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweightgintenlabo
 
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】Tomoharu ASAMI
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!Shohei Okada
 
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部Kiyoshi Ogawa
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSAyumi Goto
 
DTrace for biginners part(2)
DTrace for biginners part(2)DTrace for biginners part(2)
DTrace for biginners part(2)Shoji Haraguchi
 
Database, Polymorphism and Modern C++
Database, Polymorphism and Modern C++Database, Polymorphism and Modern C++
Database, Polymorphism and Modern C++Toshitaka Adachi
 
復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0Yuta Matsumura
 
第1回 Jubatusハンズオン
第1回 Jubatusハンズオン第1回 Jubatusハンズオン
第1回 JubatusハンズオンJubatusOfficial
 
第1回 Jubatusハンズオン
第1回 Jubatusハンズオン第1回 Jubatusハンズオン
第1回 JubatusハンズオンYuya Unno
 
Boost.B-tree introduction
Boost.B-tree introductionBoost.B-tree introduction
Boost.B-tree introductionTakayuki Goto
 

Similar to Learning Template Library Design using Boost.Geomtry (20)

What is template
What is templateWhat is template
What is template
 
Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweight
 
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
 
C++の復習
C++の復習C++の復習
C++の復習
 
Teclab3
Teclab3Teclab3
Teclab3
 
Boost Tour 1.50.0
Boost Tour 1.50.0Boost Tour 1.50.0
Boost Tour 1.50.0
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
 
DTrace for biginners part(2)
DTrace for biginners part(2)DTrace for biginners part(2)
DTrace for biginners part(2)
 
Database, Polymorphism and Modern C++
Database, Polymorphism and Modern C++Database, Polymorphism and Modern C++
Database, Polymorphism and Modern C++
 
復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0
 
第1回 Jubatusハンズオン
第1回 Jubatusハンズオン第1回 Jubatusハンズオン
第1回 Jubatusハンズオン
 
第1回 Jubatusハンズオン
第1回 Jubatusハンズオン第1回 Jubatusハンズオン
第1回 Jubatusハンズオン
 
Boost Fusion Library
Boost Fusion LibraryBoost Fusion Library
Boost Fusion Library
 
C++0x concept
C++0x conceptC++0x concept
C++0x concept
 
Introduction to Spock
Introduction to SpockIntroduction to Spock
Introduction to Spock
 
Boost.B-tree introduction
Boost.B-tree introductionBoost.B-tree introduction
Boost.B-tree introduction
 

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
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
 
Improvement future api
Improvement future apiImprovement future api
Improvement future api
 

Recently uploaded

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 

Recently uploaded (7)

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 

Learning Template Library Design using Boost.Geomtry