Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
EN
Uploaded by
Akira Takahashi
3,488 views
Learning Template Library Design using Boost.Geomtry
Technology
◦
Read more
13
Save
Share
Embed
Embed presentation
Download
Downloaded 61 times
1
/ 49
2
/ 49
3
/ 49
4
/ 49
5
/ 49
6
/ 49
7
/ 49
8
/ 49
9
/ 49
10
/ 49
11
/ 49
12
/ 49
13
/ 49
14
/ 49
15
/ 49
16
/ 49
17
/ 49
18
/ 49
19
/ 49
20
/ 49
21
/ 49
22
/ 49
23
/ 49
24
/ 49
25
/ 49
26
/ 49
27
/ 49
28
/ 49
29
/ 49
30
/ 49
31
/ 49
32
/ 49
33
/ 49
34
/ 49
35
/ 49
36
/ 49
37
/ 49
38
/ 49
39
/ 49
40
/ 49
41
/ 49
42
/ 49
43
/ 49
44
/ 49
45
/ 49
46
/ 49
47
/ 49
48
/ 49
49
/ 49
More Related Content
PPTX
N3701 concept lite
by
Takatoshi Kondo
PPTX
C言語ポインタ講座 (Lecture of Pointer in C)
by
kakira9618
PDF
わかりやすいパターン認識_2章
by
weda654
PDF
Template Meta Programming入門から応用まで
by
yoshihikoozaki5
PDF
プログラムの処方箋~健康なコードと病んだコード
by
Shigenori Sagawa
PPTX
最新C++事情 C++14-C++20 (2018年10月)
by
Akihiko Matuura
PDF
闇魔術を触ってみた
by
Satoshi Sato
PDF
わかパタ 1章
by
weda654
N3701 concept lite
by
Takatoshi Kondo
C言語ポインタ講座 (Lecture of Pointer in C)
by
kakira9618
わかりやすいパターン認識_2章
by
weda654
Template Meta Programming入門から応用まで
by
yoshihikoozaki5
プログラムの処方箋~健康なコードと病んだコード
by
Shigenori Sagawa
最新C++事情 C++14-C++20 (2018年10月)
by
Akihiko Matuura
闇魔術を触ってみた
by
Satoshi Sato
わかパタ 1章
by
weda654
What's hot
PDF
C++ Template Metaprogramming
by
Akira Takahashi
PPT
オブジェクト指向入門5
by
Kenta Hattori
PPTX
Lambda in template_final
by
Cryolite
PDF
C++0x 言語の未来を語る
by
Akira Takahashi
PDF
[第2版]Python機械学習プログラミング 第8章
by
Haruki Eguchi
PDF
C++ Template Meta Programming の紹介@社内勉強会
by
Akihiko Matuura
PDF
初心者講習会資料(Osaka.R#7)
by
Masahiro Hayashi
ODP
Object oriented-01
by
Osam Tmu
PPTX
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
by
Fujio Kojima
PDF
君はまだ,本当のプリプロセスを知らない
by
digitalghost
PDF
C++0xの概要(デブサミ2010)
by
Akira Takahashi
PDF
C++ template-primer
by
Kohsuke Yuasa
PPTX
C++0x総復習
by
道化師 堂華
PDF
多相な関数の定義から学ぶ、型クラスデザインパターン
by
Taisuke Oe
PDF
圏論とプログラミング読書会#2 資料
by
53ningen
PDF
templateとautoの型推論
by
MITSUNARI Shigeo
PDF
競技プログラミングにおけるコードの書き方とその利便性
by
Hibiki Yamashiro
PDF
dezainn
by
kzhshmt
PDF
C++ ポインタ ブートキャンプ
by
Kohsuke Yuasa
PPTX
エラーハンドリング
by
道化師 堂華
C++ Template Metaprogramming
by
Akira Takahashi
オブジェクト指向入門5
by
Kenta Hattori
Lambda in template_final
by
Cryolite
C++0x 言語の未来を語る
by
Akira Takahashi
[第2版]Python機械学習プログラミング 第8章
by
Haruki Eguchi
C++ Template Meta Programming の紹介@社内勉強会
by
Akihiko Matuura
初心者講習会資料(Osaka.R#7)
by
Masahiro Hayashi
Object oriented-01
by
Osam Tmu
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
by
Fujio Kojima
君はまだ,本当のプリプロセスを知らない
by
digitalghost
C++0xの概要(デブサミ2010)
by
Akira Takahashi
C++ template-primer
by
Kohsuke Yuasa
C++0x総復習
by
道化師 堂華
多相な関数の定義から学ぶ、型クラスデザインパターン
by
Taisuke Oe
圏論とプログラミング読書会#2 資料
by
53ningen
templateとautoの型推論
by
MITSUNARI Shigeo
競技プログラミングにおけるコードの書き方とその利便性
by
Hibiki Yamashiro
dezainn
by
kzhshmt
C++ ポインタ ブートキャンプ
by
Kohsuke Yuasa
エラーハンドリング
by
道化師 堂華
Viewers also liked
PDF
テンプレートメタプログラミング as 式
by
digitalghost
PDF
Bjarne dont speaking
by
Akira Takahashi
PDF
Boost tour 1.60.0 merge
by
Akira Takahashi
PDF
Boost Tour 1_58_0 merge
by
Akira Takahashi
PDF
Study3 boost
by
Kohsuke Yuasa
PDF
A Hole in One: Courtney Love Charms #CannesLions #OgilvyCannes
by
Ogilvy
PPT
Презентация проекта Аргус-М
by
kulibin
DOC
Zaragoza turismo 239
by
Saucepolis blog & Hotel Sauce
PPT
Sirje Tamm - Muutused haridusmaastikul õpetaja pilgu läbi
by
lepakas
PDF
BWB Meetup: Storm - distributed realtime computation system
by
Andrii Gakhov
PPTX
Тонкости email-маркетинга на крупных проектах
by
Promodo
PPT
Using Social Media For Commodity Affiliate Programs
by
Affiliate Summit
PDF
Optimizing task completion times
by
Kiran Badam
PDF
Evaluation001
by
leannacatherina
DOCX
Steam Eye Mask help you solve eye problem
by
Selina Li
PDF
Information Literacy in Higher Education
by
HELIGLIASA
PPS
میوه آرایی
by
Ali Ghaziasgar
PDF
Alliance 0
by
Food Insight
PPT
Energia punto de apoyo para el desarrollo
by
Mauricio Ceballos Vargas Bustamante
DOC
Zaragoza turismo 231
by
Saucepolis blog & Hotel Sauce
テンプレートメタプログラミング as 式
by
digitalghost
Bjarne dont speaking
by
Akira Takahashi
Boost tour 1.60.0 merge
by
Akira Takahashi
Boost Tour 1_58_0 merge
by
Akira Takahashi
Study3 boost
by
Kohsuke Yuasa
A Hole in One: Courtney Love Charms #CannesLions #OgilvyCannes
by
Ogilvy
Презентация проекта Аргус-М
by
kulibin
Zaragoza turismo 239
by
Saucepolis blog & Hotel Sauce
Sirje Tamm - Muutused haridusmaastikul õpetaja pilgu läbi
by
lepakas
BWB Meetup: Storm - distributed realtime computation system
by
Andrii Gakhov
Тонкости email-маркетинга на крупных проектах
by
Promodo
Using Social Media For Commodity Affiliate Programs
by
Affiliate Summit
Optimizing task completion times
by
Kiran Badam
Evaluation001
by
leannacatherina
Steam Eye Mask help you solve eye problem
by
Selina Li
Information Literacy in Higher Education
by
HELIGLIASA
میوه آرایی
by
Ali Ghaziasgar
Alliance 0
by
Food Insight
Energia punto de apoyo para el desarrollo
by
Mauricio Ceballos Vargas Bustamante
Zaragoza turismo 231
by
Saucepolis blog & Hotel Sauce
Similar to Learning Template Library Design using Boost.Geomtry
PDF
中3女子が狂える本当に気持ちのいい constexpr
by
Genya Murakami
PDF
Boost Tour 1.48.0 diff
by
Akira Takahashi
PDF
Boost.Flyweight
by
gintenlabo
PDF
中3女子でもわかる constexpr
by
Genya Murakami
PDF
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
by
mametter
PDF
ゲーム開発者のための C++11/C++14
by
Ryo Suzuki
PDF
boost tour 1.48.0 all
by
Akira Takahashi
PDF
Boost tour 1_44_0
by
Akira Takahashi
PDF
Boost Tour 1.50.0 All
by
Akira Takahashi
PDF
Constexpr 中3女子テクニック
by
Genya Murakami
PPT
オブジェクト指向入門9
by
Kenta Hattori
PPTX
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
by
Shin-ya Koga
PDF
PCD2019 TOKYO ワークショップ「2時間で!Processingでプログラミング入門」
by
reona396
PDF
PCL
by
Masafumi Noda
PPTX
プログラミング技法特論
by
Noritada Shimizu
PDF
Boost Fusion Library
by
Akira Takahashi
PDF
Boost tour 1_40_0
by
Akira Takahashi
PDF
Boost Tour 1.53.0 merge
by
Akira Takahashi
PDF
Datamining 5th Knn
by
sesejun
PDF
すごいH 第12章モノイド
by
Shinta Hatatani
中3女子が狂える本当に気持ちのいい constexpr
by
Genya Murakami
Boost Tour 1.48.0 diff
by
Akira Takahashi
Boost.Flyweight
by
gintenlabo
中3女子でもわかる constexpr
by
Genya Murakami
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
by
mametter
ゲーム開発者のための C++11/C++14
by
Ryo Suzuki
boost tour 1.48.0 all
by
Akira Takahashi
Boost tour 1_44_0
by
Akira Takahashi
Boost Tour 1.50.0 All
by
Akira Takahashi
Constexpr 中3女子テクニック
by
Genya Murakami
オブジェクト指向入門9
by
Kenta Hattori
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
by
Shin-ya Koga
PCD2019 TOKYO ワークショップ「2時間で!Processingでプログラミング入門」
by
reona396
PCL
by
Masafumi Noda
プログラミング技法特論
by
Noritada Shimizu
Boost Fusion Library
by
Akira Takahashi
Boost tour 1_40_0
by
Akira Takahashi
Boost Tour 1.53.0 merge
by
Akira Takahashi
Datamining 5th Knn
by
sesejun
すごいH 第12章モノイド
by
Shinta Hatatani
More from Akira Takahashi
PPTX
Cpp20 overview language features
by
Akira Takahashi
PDF
Cppmix 02
by
Akira Takahashi
PPTX
Cppmix 01
by
Akira Takahashi
PDF
Modern C++ Learning
by
Akira Takahashi
PDF
cpprefjp documentation
by
Akira Takahashi
PDF
C++1z draft
by
Akira Takahashi
PDF
Boost tour 1_61_0 merge
by
Akira Takahashi
PDF
Boost tour 1_61_0
by
Akira Takahashi
PDF
error handling using expected
by
Akira Takahashi
PDF
Boost tour 1.60.0
by
Akira Takahashi
PDF
Boost container feature
by
Akira Takahashi
PDF
Boost Tour 1_58_0
by
Akira Takahashi
PDF
C++14 solve explicit_default_constructor
by
Akira Takahashi
PDF
C++14 enum hash
by
Akira Takahashi
PDF
Multi paradigm design
by
Akira Takahashi
PDF
Start Concurrent
by
Akira Takahashi
PDF
Programmer mind
by
Akira Takahashi
PDF
Boost.Study 14 Opening
by
Akira Takahashi
PDF
Executors and schedulers
by
Akira Takahashi
PDF
Improvement future api
by
Akira Takahashi
Cpp20 overview language features
by
Akira Takahashi
Cppmix 02
by
Akira Takahashi
Cppmix 01
by
Akira Takahashi
Modern C++ Learning
by
Akira Takahashi
cpprefjp documentation
by
Akira Takahashi
C++1z draft
by
Akira Takahashi
Boost tour 1_61_0 merge
by
Akira Takahashi
Boost tour 1_61_0
by
Akira Takahashi
error handling using expected
by
Akira Takahashi
Boost tour 1.60.0
by
Akira Takahashi
Boost container feature
by
Akira Takahashi
Boost Tour 1_58_0
by
Akira Takahashi
C++14 solve explicit_default_constructor
by
Akira Takahashi
C++14 enum hash
by
Akira Takahashi
Multi paradigm design
by
Akira Takahashi
Start Concurrent
by
Akira Takahashi
Programmer mind
by
Akira Takahashi
Boost.Study 14 Opening
by
Akira Takahashi
Executors and schedulers
by
Akira Takahashi
Improvement future api
by
Akira Takahashi
Learning Template Library Design using Boost.Geomtry
1.
Boost.Geometryに学ぶ テンプレートライブラリの設計
高橋 晶(Akira Takahashi) id:faith_and_brave @cpp_akira Boost.勉強会 #6 札幌 2011/11/05(土)
2.
自己紹介 •
株式会社ロングゲート 取締役 • C++標準化委員会エキスパートメンバ • Boost Geometry Libraryコントリビュータ • boostjpコミュニティ マネージャ • 著書 『C++テンプレートテクニック』 • 『プログラミングの魔導書』 編集長
3.
この発表について • 今回の発表では、 –
Boost.Geometryがどのような使い方ができ、 – どのような設計になっているのかを知り、 – こういったライブラリをどうすれば作れるのか を見ていきます。
4.
話すこと 1. Boost Geometry
Libraryとは 2. ジェネリックプログラミング 3. Concept-based Design
5.
Chapter 01 Boost Geometry
Libraryとは What's Boost.Geometry?
6.
Boost Geometry Library •
Boost Geometry Libraryは、計算幾何のためのライブラリ • 作者:Barend Gehrels • Boost 1.47.0でリリースされた。
7.
特徴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);
8.
特徴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);
9.
特徴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);
10.
特徴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) {} };
11.
特徴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);
12.
Boost.Geometryの設計 • Boost.Geometryの設計は、
1. あらゆるモデルに対して同じアルゴリズムを適用でき、 2. 他のライブラリのモデルに対してBoost.Geometryのアルゴリズムを 適用できる。 • この発表では、このような設計のライブラリをどうやって作る のかを見ていく。
13.
Chapter 02 ジェネリックプログラミング
Generic Programming
14.
ジェネリックプログラミングとは • データ型に依存しないプログラミング手法。 • C++では、テンプレートという、パラメタライズドタイプの機能
によって実現する。 • オブジェクト指向的なライブラリは、継承関係にあるデータを 扱うが、テンプレートによって設計されたライブラリは、継承 関係に依存せずにあらゆるデータを扱う設計が可能となる。
15.
データ型に依存しないアルゴリズム 以下の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に置き換えられる
16.
あらゆるデータ型を保持できるコンテナ 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_; } };
17.
あらゆるデータ型を保持できるコンテナ 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; }
18.
STL • Alexander Stepanovが設計したSTLは、テンプレートによって、
データ構造とアルゴリズムの分離を行った。 • これによって、アルゴリズムはあらゆるデータ構造に対して 振る舞うことが可能になったため、アルゴリズムは誰か一人 が書けばよくなった。
19.
ジェネリックプログラミングのポイント • データ型が異なる以外は同じコードになるのであれば、それ
はジェネリック(汎用的)にできる。 • 型によって最適化を行いたい場合は特殊化することができる。 • ジェネリックプログラミングによるコードの汎用化は、ユー ザーコード量を限りなく減らすことができる。
20.
Chapter 03 コンセプトに基づく設計
Concept-based Design
21.
コンセプトという考え方 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コンセプトの型とし ても扱うことができる。
22.
コンセプトという考え方 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);
23.
コンセプトという考え方 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);
24.
コンセプトという考え方 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); };
25.
コンセプトという考え方 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); ???? };
26.
コンセプトという考え方 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); こういった設計はどうやったら実現できるのかを紹介する
27.
Pointコンセプトの作り方 1/5 通常、点を表すクラスは以下のように定義することになる: template
<class T> struct point { T x, y; };
28.
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); } };
29.
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)); }
30.
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]); } };
31.
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にアダプトする
32.
コンセプトでオーバーロードする 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); これを実現するには、「タグディスパッチ」という手法を用いる。
33.
コンセプトでオーバーロードする 2/9 まず、PointコンセプトとLineStringコンセプト、それぞれのための
タグを定義する。 タグは単なる空のクラス。 struct point_tag {}; struct line_string_tag {};
34.
コンセプトでオーバーロードする 3/9 タグを返すメタ関数を用意する。
中身なし。 template <class T> class get_tag;
35.
コンセプトでオーバーロードする 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; };
36.
コンセプトでオーバーロードする 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()); }
37.
コンセプトでオーバーロードする 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)); }
38.
コンセプトでオーバーロードする 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); }
39.
コンセプトでオーバーロードする 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);
40.
コンセプトでオーバーロードする 9/9 コンセプトでオーバーロードする流れ: 1. コンセプトを表すタグを定義する。タグは単なる空のクラス 2.
型を受け取ってタグを返すメタ関数を定義する 3. タグを返すメタ関数を、型ごとに特殊化する 4. 関数テンプレートのテンプレートパラメータを、 タグを返すメタ関数に渡し、結果の型を転送する 5. タグをパラメータにとるオーバーロードを用意する
41.
Concept-basedライブラリの例 • Boost.Graph
抽象化が難しいと言われるグラフにおいて、データ構造とア ルゴリズムをSTLの概念に基づいて分離したライブラリ。 特性別にグラフ構造を分類するのにコンセプトを採用してい る。 • Boost.Fusion タプルを異なる型のシーケンスと見なしイテレート可能にした ライブラリ。 Fusion Sequenceというコンセプトにアダプトされたあらゆる型 を、Fusionのタプルと見なして数々のアルゴリズムを適用す ることができる。
42.
まとめ • Boost.Geometryは、有用なアルゴリズムを提供するだけでは
なく、既存の他のライブラリと組み合わせて使用することを想 定して設計されている。 そういった設計には、コンセプトという考えを導入すると拡張 性が高くなる。 • データとアルゴリズムを分離したことで誰か一人がアルゴリ ズムを書けばいいなら、みんなで知恵を絞ることで、そのライ ブラリを使用している全てのソフトウェアが改善されることを 期待できる。 • 今回の話をふまえて、ぜひテンプレートライブラリを作ってみ てください!
43.
Appendix アルゴリズムとモデル一覧
Algorithm and Model List
44.
アルゴリズム一覧 1/5 関数
説明 図 area 面積を求める centroid 図形の中心点を求める convex_hull 凸包を求める correct 図形の向きを修正し、終了 点を補完する
45.
アルゴリズム一覧 2/5 関数
説明 図 difference 2つの図形の差異を求める disjoint 2つの図形が互いに素か判 定する distance 2つの図形の距離を求める envelope 包絡線を求める equals 2つの図形が等しいか判定 する
46.
アルゴリズム一覧 3/5 関数
説明 図 expand 他の図形でboxを拡張する for_each_point 図形を走査する for_each_segment intersection 2つの図形の共通部分を 求める intersects 2つの図形が交わっている か判定する length 図形の長さを求める perimeter overlaps 2つの図形が重なっている かを判定する
47.
アルゴリズム一覧 4/5 関数
説明 図 reverse 図形を逆向きにする simplify 図形を簡略化する transform 図形の単位変換などを行 う union_ 2つの図形の和を求める
48.
アルゴリズム一覧 5/5 関数
説明 図 unique 図形内の重複を削除する within 図形がもう一方の図形の 内側にあるか判定する
49.
モデル一覧 モデル
説明 Point N次元の点 LineString 複数の線分 Polygon 三角形(メッシュ構造) Box 四角形 Ring 輪 Segment 線分 MultiPoint 複数の点 MultiLineString 複数の線 MultiPolygon 複数の三角形
Download