C++ template-primer
Upcoming SlideShare
Loading in...5
×
 

C++ template-primer

on

  • 2,304 views

2011年 12/10 関数型都市忘年会

2011年 12/10 関数型都市忘年会

Statistics

Views

Total Views
2,304
Views on SlideShare
2,285
Embed Views
19

Actions

Likes
1
Downloads
18
Comments
0

4 Embeds 19

http://paper.li 9
http://a0.twimg.com 7
http://www.slashdocs.com 2
http://us-w1.rockmelt.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

C++ template-primer C++ template-primer Presentation Transcript

  • C++ テンプレート入門 @hotwatermorning11/12/13 関数型都市忘年会 1
  • 自己紹介● @hotwatermorning● C++でプログラム書いてます。11/12/13 関数型都市忘年会 2
  • 自己紹介● Boost.勉強会 #6 札幌を開催しました!11/12/13 関数型都市忘年会 3
  • Introduction11/12/13 関数型都市忘年会 4
  • Introduction 今日のお話Introduction ● Whats BenefitHow to use ● C++テンプレート入門Conclusion ● C++のテンプレートという仕組みを 紹介します 11/12/13 関数型都市忘年会 5
  • Introduction 主な対象者Introduction ● Whats BenefitHow to use ● C++や、Cライクな文法の言語をConclusion 触ったことがある人 ● テンプレートは使いこなしていない けど興味がある人 ● テンプレートとか日常的に使いこな してるけど、発表をひやかしたい人 11/12/13 関数型都市忘年会 6
  • Introduction 〜 本日のレシピ 〜Introduction Whats BenefitHow to use ● Whats the Template?Conclusion ● テンプレートとは? ● Whats the Benefit? ● テンプレートを使うと何が嬉しい? ● How to use the Template. ● テンプレートの使い方/書き方 11/12/13 関数型都市忘年会 7
  • Whats the Template?11/12/13 関数型都市忘年会 8
  • Whats the Template? テンプレートとは?Introduction ● Whats BenefitHow to use ● C++の言語機能の一つConclusion ● 1990年7月の会議でC++の規格に取り込まれ た。 ● 型を差し替え可能なクラスや関数を 書くことが出来る仕組み。 ● 型とデータ構造とアルゴリズムを 分離できる ● →コードの再利用性が高い 11/12/13 関数型都市忘年会 9
  • Whats the Template? 元々の要望は、コンテナの格納できIntroduction ● Whats Benefit る方をパラメータ化したいというこHow to useConclusion とから ● 標準ライブラリには柔軟で効率のいいコン テナが必要 ● intを格納する動的配列 ● 浮動小数点数を格納する線形リスト ● intからstringへの連想配列、などなど ● C with Classes(C++の前身)の頃は マクロで対処していた 11/12/13 関数型都市忘年会 10
  • Whats the Template?#define stackdeclare(TYPE) class stack(TYPE) { TYPE *min_; TYPE *max_; TYPE *top_; public: stack(TYPE)(int n); ~stack(TYPE)(); void push(TYPE x); TYPE pop(); };11/12/13 関数型都市忘年会 11
  • Whats the Template?#define stackimplement(TYPE) stack(TYPE)::stack(TYPE)(int n) { min_ = top_ = new TYPE(n); max_ = min_ + n; } stack(TYPE)::~stack(TYPE)() { delete[] min_; } void stack(TYPE)::push(TYPE x) { assert(top_ != min_); *top_++ = x; } こんな感じで行を結合しながら書いていく・・・11/12/13 関数型都市忘年会 12
  • Whats the Template?#define name2(X,Y) X/**/Y => トークンペーストマクロ => 現在の仕様では X##Yとする#define declare(CLASS,TYPE) name2(CLASS,declare)(TYPE)#define implement(CLASS,TYPE) name2(CLASS,implement)(TYPE)#define stack(TYPE) name2(stack,TYPE)11/12/13 関数型都市忘年会 13
  • Whats the Template? ユーザーコードではIntroduction ● Whats BenefitHow to use ● declare(stack, long);のように宣言Conclusion ● implement(stack, long);のように定義して、 stack(long) sl(1024); stack(long) sl(1024); sl.push(123L); sl.push(123L); long value = sl.pop(); long value = sl.pop(); のように使う。 11/12/13 関数型都市忘年会 14
  • Whats the Template? マクロの問題点Introduction ● Whats BenefitHow to useConclusion ● マクロはただのテキスト処理 ● スコープの概念もない ● かの有名なmin/maxマクロ(in windows.h) ● コンパイラサポートがない ● 型安全ではない ● 型推論も出来ない 11/12/13 関数型都市忘年会 15
  • Whats the Template? マクロの問題点Introduction ● Whats BenefitHow to useConclusion ● 文法がC++のソースと違う。厄介で 面倒でバグのもと ● 複数行のマクロを書こうと思うと末尾の行 の結合が必要 ● 引数をカッコで括る必要が有ったりなかっ たり ● 引数が何度も評価されてしまったり 11/12/13 関数型都市忘年会 16
  • Whats the Template?#define mul2(a,b) (a*b)void func1(){ int x = mul2(2, 3); //=> (2*3) => 6 OK! int y = mul2(2+1, 3+1); //=> (2+1*3+1) => 6 !? //=> mul2(a,b)は、((a)*(b))という形の      //定義じゃないといけない}11/12/13 関数型都市忘年会 17
  • Whats the Template? マクロではなく、Introduction ● Whats ちゃんと言語機能として BenefitHow to useConclusion サポートしようという風になった。 11/12/13 関数型都市忘年会 18
  • Whats the Template?Introduction Whats ● Stroustrupが選んだ設計方針案 BenefitHow to use ● Smalltalk風 動的typingと継承を使うConclusion ● ● Clu風 ● 静的typingと、引数で型を指定できる仕組み を使う ● 前者はランタイムコストが大きく、 また静的型付け言語であるC++のや り方と相容れない。 11/12/13 関数型都市忘年会 19
  • Whats the Template?Introduction Whats ● Stroustrupが選んだ設計方針案 BenefitHow to use ● Smalltalk風 動的typingと継承を使うConclusion ● ● Clu風 ● 静的typingと、引数で型を指定できる仕組み を使う ● 前者はランタイムコストが大きく、 また静的型付け言語であるC++のや り方と相容れない。=> 後者を採用 11/12/13 関数型都市忘年会 20
  • Whats the Template?Introduction Whats ● Stroustrupが選んだ設計方針案 BenefitHow to use ● Stroustrup曰く 「理想的には、C++はCluの方法にConclusion 基づき、ランタイムとスペース効率 が良く、コンパイル時のオーバー ヘッドも少ない仕組みを実現した い、また柔軟性は、Smalltalkのよう に大きくなければならない」 (D&E第一版 15.2 P.431) 11/12/13 関数型都市忘年会 21
  • Whats the Template? そうして出来上がったのが今のテンIntroduction ● Whats Benefit プレートHow to useConclusion 11/12/13 関数型都市忘年会 22
  • Whats the Template?template<class T>class ClassA{ T value_;};template<class T>int FunctionB(T arg){ arg.get_value();}11/12/13 関数型都市忘年会 23
  • Whats the Template? そうして出来上がったのが今のテンIntroduction ● Whats Benefit プレートHow to useConclusion ● テンプレート化したクラス ● => クラステンプレート template<class T> template<class T> class ClassA class ClassA { { T T value_; value_; }; }; 11/12/13 関数型都市忘年会 24
  • Whats the Template? そうして出来上がったのが今のテンIntroduction ● Whats Benefit プレートHow to useConclusion ● テンプレート化した関数 ● => 関数テンプレート template<class T> template<class T> int FunctionB(T arg) int FunctionB(T arg) { { arg.get_value(); arg.get_value(); } } 11/12/13 関数型都市忘年会 25
  • Whats the Template? こんな感じで使えるという例Introduction ● Whats BenefitHow to useConclusion 11/12/13 関数型都市忘年会 26
  • Whats the Template? こんな感じで使えるという例Introduction ● Whats BenefitHow to use template< template<Conclusion class T, Alloc = std::allocator<T> class T, Alloc = std::allocator<T> > > class vector class vector { { size_t size_t size () const; size () const; T & T & front (); front (); T const & front () const; T const & front () const; //その他ごにょごにょ //その他ごにょごにょ }; }; ● こんな定義のクラステンプレート 11/12/13 関数型都市忘年会 27
  • Whats the Template? こんな感じで使えるという例Introduction ● Whats BenefitHow to use //int型の要素を持つvectorクラス //int型の要素を持つvectorクラスConclusion std::vector<int> is; std::vector<int> is; //char型の要素を持つvectorクラス //char型の要素を持つvectorクラス std::vector<char> cs; std::vector<char> cs; //std::string型の要素をもつvectorクラス //std::string型の要素をもつvectorクラス std::vector<std::string> ss; std::vector<std::string> ss; //なんらかのユーザー定義型を要素に持つ //なんらかのユーザー定義型を要素に持つ //vectorクラス //vectorクラス std::vector<SomeUserDefinedType> us; std::vector<SomeUserDefinedType> us; 11/12/13 関数型都市忘年会 28
  • Whats the Template? こんな感じで使えるという例Introduction ● Whats BenefitHow to use is.size(); is.size();Conclusion cs.size(); cs.size(); ss.size(); ss.size(); us.size(); us.size(); ● 全部使い方一緒! 11/12/13 関数型都市忘年会 29
  • Whats the Template? こんな感じで使えるという例Introduction ● Whats BenefitHow to use is.front(); //(int &) is.front(); //(int &) cs.front(); //(char &) cs.front(); //(char &)Conclusion ss.front(); //(std::string &) ss.front(); //(std::string &) us.front(); //(SomeUserDefinedType &) us.front(); //(SomeUserDefinedType &) ● それぞれ指定した型で要素を取得で きる!! 11/12/13 関数型都市忘年会 30
  • Whats the Template? もうひとつの例Introduction ● Whats BenefitHow to useConclusion ● 二つの変数が与えられたときに、比 較して小さい方を返す。 11/12/13 関数型都市忘年会 31
  • Whats the Template?Introduction Whats ● minマクロ BenefitHow to use #define min(a,b) ((a)<(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b))Conclusion ● 関数で実装するなら・・・? ?? min(?? a, ?? b) { ?? min(?? a, ?? b) { return a < b ? a : b; return a < b ? a : b; } } 11/12/13 関数型都市忘年会 32
  • Whats the Template? マクロはあんまり良くないので、関Introduction ● Whats Benefit 数で書きたい でも、こんな汎用的な処理を色んなHow to use ●Conclusion 型のバージョンで分けて書いていら れない(そもそもユーザー定義型に も対応したい) 11/12/13 関数型都市忘年会 33
  • Whats the Template? 比較可能であることを表す、Introduction ● Whats Benefit IComparableから派生したクラスのHow to useConclusion 変数だけを受け取って、仮想関数 compareで比較する? ● POD型に対応できない。 ● 比較するだけで仮想関数の仕組みを使わな くてはいけないのは嬉しくない。 11/12/13 関数型都市忘年会 34
  • Whats the Template? 先程の??の型は(a < b)が定義されてIntroduction ● Whats Benefit る型なら何でもいいHow to useConclusion ● テンプレート化 template<class T> template<class T> T const & min(T const &a, T const &b) T const & min(T const &a, T const &b) { { return a < b ? a : b; return a < b ? a : b; //中味はさっきと全く一緒でおk。 //中味はさっきと全く一緒でおk。 } } ● 型安全なまま、抽象度の高いプログ ラムが書ける 11/12/13 関数型都市忘年会 35
  • Whats the Template? テンプレートには、型だけではなIntroduction ● Whats Benefit く、コンパイル時定数を使用するこHow to useConclusion とも出来る。 template<int N> template<int N> struct twice struct twice { { static const int value = static const int value = N + N; N + N; }; }; 11/12/13 関数型都市忘年会 36
  • Whats the Benefit?11/12/13 関数型都市忘年会 37
  • Whats the Benefit? テンプレートがあることで嬉しいこIntroduction ● Whats Benefit とはなにか? => テンプレートはコードの再利用How to use ●Conclusion 性を高める 11/12/13 関数型都市忘年会 38
  • Whats the Benefit? テンプレートはクラスと関数の型をIntroduction ● Whats Benefit パラメータ化する仕組み 型をパラメータ化することで、クラHow to use ●Conclusion スと関数を型と分離して書くことが 出来る。 11/12/13 関数型都市忘年会 39
  • Whats the Benefit? 型をパラメータ化したコンテナIntroduction ● Whats BenefitHow to use ● std::vector, std::list, std::map,Conclusion std::queue, etc... ● 型がAssignableであるなど、いくつ かの要件を満たすものであれば、何 でもこれらコンテナに渡すことが出 来る。 11/12/13 関数型都市忘年会 40
  • Whats the Benefit? 型をパラメータ化した関数Introduction ● Whats BenefitHow to use ● std::min/max, std::swap, std::find,Conclusion std::sort, etc... ● std::minとstd::maxは、型が operator<で比較可能であれば、どん な型でも使用することが出来る。 ● operator<が定義されていなくても、比較関 数を指定するバージョンを使うこと で、std::minを使用できる。 11/12/13 関数型都市忘年会 41
  • Whats the Benefit? 型をパラメータ化した関数Introduction ● Whats BenefitHow to use ● std::min/max, std::swap, std::find,Conclusion std::sort, etc... ● std::swapは、型がAssignableである なら、どんな型でもswapに渡して使 うことが出来る。 11/12/13 関数型都市忘年会 42
  • Whats the Benefit? 型をパラメータ化した関数Introduction ● Whats BenefitHow to use ● std::min/max, std::swap, std::find,Conclusion std::sort, etc... ● std::find, std::sortなど ● これらはSTLの`アルゴリズムと呼ば れる。 11/12/13 関数型都市忘年会 43
  • Whats the Benefit? 型をパラメータ化した関数Introduction ● Whats BenefitHow to use ● std::min/max, std::swap, std::find,Conclusion std::sort, etc... ● std::find, std::sortなど ● イテレータという仕組みによって、 具体的なコンテナなどでなく、抽象 的な値の列(シーケンス)を扱えるよ うになっている。 11/12/13 関数型都市忘年会 44
  • Whats the Benefit? アルゴリズムは値の列を辿って何かIntroduction ● Whats Benefit したい => コンテナなどを直接触らないで、How to useConclusion ● イテレータと呼ばれる小さなクラス に、コンテナから要素を参照する処 理を委譲。 ● => アルゴリズムは、イテレータをテ ンプレートにすることで、イテレー タの要件を満たす型を受け付けるよ うにする。 11/12/13 関数型都市忘年会 45
  • Whats the Benefit? => イテレータが用意出来れば、どIntroduction ● Whats Benefit んなコンテナや、値の列であってHow to use も、それをアルゴリズムに対して使 用できるようになる。Conclusion ● ポインタもイテレータの要件を満たす ● というより、C++のイテレータは、ポインタ を参考にして作られた。 11/12/13 関数型都市忘年会 46
  • Whats the Benefit? プログラムの中にはたくさんのデーIntroduction ● Whats Benefit タ型と、たくさんのクラスと、たくHow to useConclusion さんの関数がある。 ● とあるプログラムの中の 型の数をi、クラスの数をj、そしてア ルゴリズムの数をkで表すとする。 11/12/13 関数型都市忘年会 47
  • Whats the Benefit? それら全てに対応するプログラムをIntroduction ● Whats Benefit 書くとすると、i * j * k個の組み合わHow to useConclusion せに対応しないといけない。 11/12/13 関数型都市忘年会 48
  • Whats the Benefit? テンプレートを使って、Introduction ● Whats Benefit ● 型とコンテナ、How to useConclusion ● 型とアルゴリズム、 ● コンテナとアルゴリズム ● を分離すれば、それぞれ、型をiだ け、コンテナをjだけ、アルゴリズム をkだけ用意すればいい。 ● つまりi + j + kで済む。 11/12/13 関数型都市忘年会 49
  • Whats the Benefit? オブジェクト指向では継承によっIntroduction ● Whats Benefit て、クラス定義を再利用することがHow to useConclusion 可能になった。 ● C++のテンプレートでは、型をパラ メータ化することで、クラス定義の 再利用を可能にした。ついでにオブ ジェクト指向では不可能だった、関 数の再利用も可能にした。 11/12/13 関数型都市忘年会 50
  • Whats the Benefit? テンプレートを使うことで、ジェネIntroduction ● Whats Benefit リックプログラミングが可能になっHow to useConclusion た。 ● ジェネリックプログラミング。 ● 「型を決定していないクラスや関数 の断片を用意しておき、それらの組 み合わせでプログラミングをする」 (C++テンプレートテクニック 第一版 P.51) 11/12/13 関数型都市忘年会 51
  • Whats the Benefit? テンプレートを使用して嬉しいことIntroduction ● Whats Benefit は、これだけじゃない。How to useConclusion ● クラスがテンプレート化出来るとい うことは、さらに重要な意味を持 つ。 ● => メタ関数 ● => Template Meta Programming 11/12/13 関数型都市忘年会 52
  • Whats the Benefit?Introduction Whats template<class T> template<class T> Benefit struct add_const { struct add_const {How to use typedef T const type; typedef T const type;Conclusion }; }; ● このようなクラステンプレートが 有ったときに、 add_const<int>::type add_const<int>::type ● という型はint constになる。 ● charをテンプレート引数に渡せばchar const に。std::stringならstd::string constに。 11/12/13 関数型都市忘年会 53
  • Whats the Benefit?Introduction Whats template<class T> template<class T> Benefit struct add_const { struct add_const {How to use typedef T const type; typedef T const type;Conclusion }; }; ● add_constに型を渡すと、型にconst を修飾した型を得ることができる。 11/12/13 関数型都市忘年会 54
  • Whats the Benefit?Introduction Whats template<class T> template<class T> Benefit struct add_pointer { struct add_pointer {How to use typedef T * type; typedef T * type;Conclusion }; }; ● このようなクラステンプレートが 有ったときに、 add_pointer<int>::type add_pointer<int>::type ● という型はint *になる。 ● charをテンプレート引数に渡せばchar * に。std::stringならstd::string *に。 11/12/13 関数型都市忘年会 55
  • Whats the Benefit?Introduction Whats template<class T> template<class T> Benefit struct add_pointer { struct add_pointer {How to use typedef T * type; typedef T * type;Conclusion }; }; ● add_pointerに型を渡すと、型に*を 修飾した型を得ることが出来る。 11/12/13 関数型都市忘年会 56
  • Whats the Benefit?Introduction クラス名<テンプレート引数>::type クラス名<テンプレート引数>::type Whats BenefitHow to useConclusion ● クラス名を関数名、テンプレート引 数を引数、typeを戻り値の選択とい う風に捉えると、関数のように考え ることが出来る。 11/12/13 関数型都市忘年会 57
  • Whats the Benefit?Introduction クラス名<テンプレート引数>::type クラス名<テンプレート引数>::type Whats BenefitHow to useConclusion ● クラス名を関数名、テンプレート引 数を引数、typeを戻り値の選択とい う風に捉えると、関数のように考え ることが出来る。 ● 通常の関数と違い、型に関する操作 が基本。 ● => Template Meta Programming 11/12/13 関数型都市忘年会 58
  • Whats the Benefit? これをこじらせると^H^H^H^H^H^HIntroduction ● Whats Benefit 発展させるとどうなるかHow to useConclusion 11/12/13 関数型都市忘年会 59
  • Whats the Template?namespace mpl = boost::mpl;typedef mpl::vector<int, std::string, user_defined_type>seq1;typedef mpl::list<int, std::string, user_defined_type>seq2;// mpl::equal は、Sequence の比較を行うBOOST_MPL_ASSERT((mpl::equal< seq1, seq2 >));//型のシーケンス(コンパイル時データ構造)を作って、その要素(型が要素!)を比較11/12/13 関数型都市忘年会 60
  • Whats the Benefit? これをこじらせると^H^H^H^H^H^HIntroduction ● Whats Benefit 発展させるとどうなるかHow to useConclusion ● こんなものも ● http://d.hatena.ne.jp/tarao/20111101/ 1320143278 「C++のテンプレートでラムダ計算 と型推論」 11/12/13 関数型都市忘年会 61
  • Whats the Benefit? その他、テンプレートを使うことでIntroduction ● Whats Benefit 可能になる、便利なテクニックHow to useConclusion ● ポリシークラス – クラスの挙動をテンプレートで差し替える ● パラメータ化継承 – 継承関係をテンプレートで差し替える ● CRTP – 静的多態 ● タグディスパッチ – 静的オーバーロード ● SFINAE – 静的オーバーロード 11/12/13 関数型都市忘年会 62
  • Whats the Benefit? ポリシークラスIntroduction ● Whats クラスの挙動をテンプレートで差し Benefit ● 替えるHow to useConclusion 11/12/13 関数型都市忘年会 63
  • Whats the Benefit?template<class Policy>struct logger{ //なんかいろいろなコンストラクタなど void output(char const *msg) { Policy::output(msg); } //なんかいろいろなメンバ関数};11/12/13 関数型都市忘年会 64
  • Whats the Benefit?strict cout_policy{ static void output(char const *msg) { std::cout << msg << std::endl; }};struct debugger_policy{ static void output(char const *msg ) { OutputDebugString(msg); }};11/12/13 関数型都市忘年会 65
  • Whats the Benefit? ポリシークラスIntroduction ● Whats BenefitHow to use void function_to_be_logged() void function_to_be_logged()Conclusion { { logger<cout_policy> lg; logger<cout_policy> lg; lg.output("logging message"); lg.output("logging message"); } } ● 標準出力にログが吐き出される 11/12/13 関数型都市忘年会 66
  • Whats the Benefit? ポリシークラスIntroduction ● Whats BenefitHow to use void function_to_be_logged() void function_to_be_logged()Conclusion { { logger<debugger_policy> lg; logger<debugger_policy> lg; lg.output("logging message"); lg.output("logging message"); } } ● デバッグ出力にログが吐き出される 11/12/13 関数型都市忘年会 67
  • Whats the Benefit?Introduction Whats ● loggerを継承したりすることな Benefit く、loggerの挙動を変更することが 出来るHow to useConclusion 11/12/13 関数型都市忘年会 68
  • Whats the Benefit?Introduction Whats ● loggerは受け取りたいポリシーに Benefit outputという名前のstaticメンバ関数 があることだけしか要求していないHow to useConclusion //自分で定義した、 //自分で定義した、 //outputスタティックメンバ関数を持つクラス //outputスタティックメンバ関数を持つクラス struct my_logger_policy; struct my_logger_policy; ● こんなクラスもloggerのポリシーに 渡すことが出来る。 11/12/13 関数型都市忘年会 69
  • Whats the Benefit?Introduction Whats ● policyはloggerが必要とする要件にし Benefit か依存していない。How to useConclusion ● loggerもpolicyに求める要件の実装に しか依存していない。 ● Non-Intrusive:非侵入的 ● 「トリから始まるnon-intrusiveness談義 http://togetter.com/li/33641 11/12/13 関数型都市忘年会 70
  • Whats the Benefit? その他、テンプレートを使うことでIntroduction ● Whats Benefit 可能になる、便利なテクニック 多分ここらへんが聞いてて一番面白How to use ●Conclusion くなるはずのところですが残念なが ら資料ができていませんごめんなさ い。 11/12/13 関数型都市忘年会 71
  • How to use the Template.11/12/13 関数型都市忘年会 72
  • How to use the Template. テンプレートの使い方/書き方Introduction ● Whats クラステンプレート Benefit ●How to useConclusion ● 関数テンプレート 11/12/13 関数型都市忘年会 73
  • How to use the Template. クラステンプレートの使い方Introduction ● Whats BenefitHow to useConclusion 11/12/13 関数型都市忘年会 74
  • How to use the Template. クラステンプレートの使い方Introduction ● Whats BenefitHow to use std::vector<int> std::vector<int> vs; vs;Conclusion //長ければtypedefして //長ければtypedefして typedef std::vector<int> int_vector; typedef std::vector<int> int_vector; int_vector int_vector vs2; vs2; 11/12/13 関数型都市忘年会 75
  • How to use the Template. クラステンプレートの使い方Introduction ● Whats BenefitHow to use //2引数を取るようなクラステンプレートには //2引数を取るようなクラステンプレートにはConclusion //カンマ区切りでテンプレート型を指定する //カンマ区切りでテンプレート型を指定する typedef typedef std::pair<std::string, double> std::pair<std::string, double> pair_t; pair_t; 11/12/13 関数型都市忘年会 76
  • How to use the Template. クラステンプレートの使い方Introduction ● Whats BenefitHow to use //入れ子になったテンプレート //入れ子になったテンプレートConclusion typedef std::list<std::list<int> > typedef std::list<std::list<int> > 11/12/13 関数型都市忘年会 77
  • How to use the Template. クラステンプレートの使い方Introduction ● Whats BenefitHow to use //入れ子になったテンプレート //入れ子になったテンプレートConclusion typedef std::list<std::list<int> > typedef std::list<std::list<int> > ● 入れ子になったテンプレート引数を指定す るとき、右の山括弧の間にスペースを空けな いと、operator>>と解釈が曖昧になるの で、スペースが必要 ● C++11からスペース開けなくてもよくなった ● C++03のコンパイラでも、スペース開けなく てもいいものもある。 11/12/13 関数型都市忘年会 78
  • How to use the Template. クラステンプレートの書き方Introduction ● Whats BenefitHow to use template<class T> template<class T>Conclusion struct ParameterizedClass struct ParameterizedClass { /*ごにょごにょ*/ }; { /*ごにょごにょ*/ }; template<typename T> template<typename T> struct ParameterizedClass struct ParameterizedClass { /*ごにょごにょ*/ }; { /*ごにょごにょ*/ }; ● 普通のクラス定義の直前に template<class T>のようにして、パ ラメータ化する型を書く 11/12/13 関数型都市忘年会 79
  • How to use the Template. クラステンプレートの書き方Introduction ● Whats BenefitHow to use template<class T> template<class T>Conclusion struct ParameterizedClass struct ParameterizedClass { /*ごにょごにょ*/ }; { /*ごにょごにょ*/ }; template<typename T> template<typename T> struct ParameterizedClass struct ParameterizedClass { /*ごにょごにょ*/ }; { /*ごにょごにょ*/ }; ● Tには好きな型名を付ける ● 型の指定はclass/typename どちらで も良い 11/12/13 関数型都市忘年会 80
  • How to use the Template. クラステンプレートの書き方Introduction ● Whats BenefitHow to use template<class T> template<class T>Conclusion struct ParameterizedClass struct ParameterizedClass { { T member_variable_; T member_variable_; T const & get_value () const T const & get_value () const { { return member_variable_; } return member_variable_; } void set_value (T const &new_value) void set_value (T const &new_value) { { member_variable_ = new_value; } member_variable_ = new_value; } }; }; ● クラス内部では、既知の型のように テンプレートを使用できる。 11/12/13 関数型都市忘年会 81
  • How to use the Template. クラステンプレートの書き方Introduction ● Whats Benefit typedef typedefHow to use ParameterizedClass<int> ParameterizedClass<int>Conclusion default_params_t; default_params_t; ● このままだと、default_params_tの 利用者がdefault_params_tから、 ParameterizedClassになんの型が渡 されたかを取得する方法がない 11/12/13 関数型都市忘年会 82
  • How to use the Template. クラステンプレートの書き方Introduction ● Whats もし、クラステンプレートに渡され Benefit ● たテンプレート引数を、クラス外部How to useConclusion からも取得できるようにするには、 メタ関数を用いる。 template<class T> template<class T> struct ParametrizedClass struct ParametrizedClass { { typedef T value_type; typedef T value_type; }; }; 11/12/13 関数型都市忘年会 83
  • How to use the Template. クラステンプレートの書き方Introduction ● Whats これで、先程のdefault_params_tか Benefit ●How to useConclusion ら default_params_t::value_type; default_params_t::value_type; 元々のクラステンプレートに渡され た型を取得できました。 ● 余談ですが、このdefault_params_tは、引 数なしメタ関数と呼ばれるものです。詳し くはC++テンプレートメタプログラミング (デビッド・アブラハムズ, アレクセイ・グ ルトヴォイ)を参照してください 11/12/13 関数型都市忘年会 84
  • How to use the Template. クラステンプレートの書き方Introduction ● Whats 複数のテンプレート引数はカンマ区 Benefit ● 切りで指定する。How to useConclusion template<class T1, class T2> template<class T1, class T2> struct ParameterizedClass2 struct ParameterizedClass2 { /*ごにょごにょ*/ }; { /*ごにょごにょ*/ }; 11/12/13 関数型都市忘年会 85
  • How to use the Template. クラステンプレートの書き方Introduction ● Whats もっとも後ろのテンプレート引数か Benefit ● ら順に、デフォルト引数を指定できHow to useConclusion る template< template< class class T1, T1, class class T2 = T2 = void, void, class class T3 = T3 = void, void, class class T4 = T4 = void void > > struct ManyParamClass struct ManyParamClass { /*ごにょごにょ*/ }; { /*ごにょごにょ*/ }; ● 頻繁に指定される引数を省略できる 11/12/13 関数型都市忘年会 86
  • How to use the Template. 関数テンプレートの使い方Introduction ● Whats BenefitHow to useConclusion 11/12/13 関数型都市忘年会 87
  • How to use the Template. 関数テンプレートの使い方Introduction ● Whats BenefitHow to useConclusion template<class T> template<class T> T const & min( T const & min( T const &a, T const &a, T const &b T const &b ) ) { { return a < b ? a : b; return a < b ? a : b; } } 11/12/13 関数型都市忘年会 88
  • How to use the Template. 関数テンプレートの使い方Introduction ● Whats BenefitHow to useConclusion int const m = int const m = std::min(3, 4); std::min(3, 4); //assert(m == 3); //assert(m == 3); //windows.hでminマクロが //windows.hでminマクロが //定義されているときの //定義されているときの //workaround //workaround int const m = int const m = (std::min)(3, 4); (std::min)(3, 4); //関数をカッコで括っても呼び出せる //関数をカッコで括っても呼び出せる 11/12/13 関数型都市忘年会 89
  • How to use the Template. 関数テンプレートの使い方Introduction ● Whats 引数からテンプレートの型が推論で Benefit ● きる場合は、テンプレート引数を指How to useConclusion 定する必要はない。 11/12/13 関数型都市忘年会 90
  • How to use the Template. 関数テンプレートの書き方Introduction ● Whats BenefitHow to use template<class T> template<class T>Conclusion void func(T const &t) void func(T const &t) { { t.get_value(); t.get_value(); } } 11/12/13 関数型都市忘年会 91
  • How to use the Template. 関数テンプレートの書き方Introduction ● Whats BenefitHow to use template<class T> template<class T>Conclusion void func(T const &t) void func(T const &t) { { t.get_value(); t.get_value(); } } *残りの説明は未実装。。。 11/12/13 関数型都市忘年会 92
  • Conclusion11/12/13 関数型都市忘年会 93
  • ConclusionIntroduction Whats ● C++のテンプレートはとても便利 Benefit で、実行時効率を損なうこと無く、How to use 柔軟で再利用性の高いコードを書く ことが出来る仕組みです。Conclusion 11/12/13 関数型都市忘年会 94
  • ConclusionIntroduction Whats ● C++11になって、C++のテンプレー Benefit トはより便利になります(可変長テン プレートなど)How to useConclusion ● 普段C++を使っていて、テンプレー トをあまり使ったことがない人がい たら、ぜひテンプレートに手を出し てみてはいかがでしょうか。 11/12/13 関数型都市忘年会 95
  • Conclusion 参考文献/サイトIntroduction ● Whats Benefit ● 「C++リファレンスマニュアル」How to useConclusion アジソンウェスレイ ● 「C++の設計と進化」 ソフトバンクパブリッシング ● 「C++テンプレートテクニック」 ソフトバンククリエイティブ ● 「C++テンプレートメタプログラミング」 翔泳社 ● http://www.cplusplus.com/ ● http://www.sgi.com/tech/stl/index.html 11/12/13 関数型都市忘年会 96
  • Thank You! ありがとうございました!11/12/13 関数型都市忘年会 97
  • ちなみに。 この資料でやり残してること。Introduction ● Whats BenefitHow to use ● typenameキーワードConclusion ● template限定子 ● CRTPなどの紹介 ● 関数テンプレートの使い方と型推 論の紹介 11/12/13 関数型都市忘年会 98