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++テンプレート入...
Introduction                    主な対象者Introduction                ●  Whats  BenefitHow to use                ●   C++や、Cライクな...
Introduction                           〜 本日のレシピ 〜Introduction  Whats  BenefitHow to use      ●   Whats the Template?Conclu...
Whats the Template?11/12/13          関数型都市忘年会        8
Whats the Template?                    テンプレートとは?Introduction                ●  Whats  BenefitHow to use                ●  ...
Whats the Template?                    元々の要望は、コンテナの格納できIntroduction                ●  Whats  Benefit           る方をパラメータ化した...
Whats the Template?#define stackdeclare(TYPE) class stack(TYPE) {     TYPE *min_;     TYPE *max_;     TYPE *top_; public: ...
Whats the Template?#define stackimplement(TYPE) stack(TYPE)::stack(TYPE)(int n) {     min_ = top_ = new TYPE(n);     max_ ...
Whats the Template?#define name2(X,Y) X/**/Y    => トークンペーストマクロ    => 現在の仕様では X##Yとする#define declare(CLASS,TYPE)     name2(...
Whats the Template?                    ユーザーコードではIntroduction                ●  Whats  BenefitHow to use                   ...
Whats the Template?                    マクロの問題点Introduction                ●  Whats  BenefitHow to useConclusion      ●    ...
Whats the Template?                    マクロの問題点Introduction                ●  Whats  BenefitHow to useConclusion           ...
Whats the Template?#define mul2(a,b) (a*b)void func1(){    int x = mul2(2, 3);             //=> (2*3) => 6 OK!  int y = mu...
Whats the Template?                    マクロではなく、Introduction                ●  Whats                    ちゃんと言語機能として  Benefi...
Whats the Template?Introduction  Whats                ●   Stroustrupが選んだ設計方針案  BenefitHow to use                ●   Smallt...
Whats the Template?Introduction  Whats                ●   Stroustrupが選んだ設計方針案  BenefitHow to use                ●   Smallt...
Whats the Template?Introduction  Whats                ●   Stroustrupが選んだ設計方針案  BenefitHow to use                ●   Strous...
Whats the Template?                    そうして出来上がったのが今のテンIntroduction                ●  Whats  Benefit           プレートHow to ...
Whats the Template?template<class T>class ClassA{    T   value_;};template<class T>int FunctionB(T arg){    arg.get_value(...
Whats the Template?                    そうして出来上がったのが今のテンIntroduction                ●  Whats  Benefit           プレートHow to ...
Whats the Template?                    そうして出来上がったのが今のテンIntroduction                ●  Whats  Benefit           プレートHow to ...
Whats the Template?                    こんな感じで使えるという例Introduction                ●  Whats  BenefitHow to useConclusion     ...
Whats the Template?                    こんな感じで使えるという例Introduction                ●  Whats  BenefitHow to use           temp...
Whats the Template?                    こんな感じで使えるという例Introduction                ●  Whats  BenefitHow to use           //in...
Whats the Template?                    こんな感じで使えるという例Introduction                ●  Whats  BenefitHow to use               ...
Whats the Template?                    こんな感じで使えるという例Introduction                ●  Whats  BenefitHow to use               ...
Whats the Template?                    もうひとつの例Introduction                ●  Whats  BenefitHow to useConclusion      ●    ...
Whats the Template?Introduction  Whats                ●   minマクロ  BenefitHow to use                #define min(a,b) ((a)<(...
Whats the Template?                    マクロはあんまり良くないので、関Introduction                ●  Whats  Benefit           数で書きたい     ...
Whats the Template?                    比較可能であることを表す、Introduction                ●  Whats  Benefit           IComparableから派...
Whats the Template?                    先程の??の型は(a < b)が定義されてIntroduction                ●  Whats  Benefit                 ...
Whats the Template?                    テンプレートには、型だけではなIntroduction                ●  Whats  Benefit           く、コンパイル時定数を使...
Whats the Benefit?11/12/13         関数型都市忘年会        37
Whats the Benefit?                    テンプレートがあることで嬉しいこIntroduction                ●  Whats  Benefit           とはなにか?      ...
Whats the Benefit?                    テンプレートはクラスと関数の型をIntroduction                ●  Whats  Benefit           パラメータ化する仕組み ...
Whats the Benefit?                    型をパラメータ化したコンテナIntroduction                ●  Whats  BenefitHow to use               ...
Whats the Benefit?                    型をパラメータ化した関数Introduction                ●  Whats  BenefitHow to use                ●...
Whats the Benefit?                    型をパラメータ化した関数Introduction                ●  Whats  BenefitHow to use                ●...
Whats the Benefit?                    型をパラメータ化した関数Introduction                ●  Whats  BenefitHow to use                ●...
Whats the Benefit?                    型をパラメータ化した関数Introduction                ●  Whats  BenefitHow to use                ●...
Whats the Benefit?                    アルゴリズムは値の列を辿って何かIntroduction                ●  Whats  Benefit           したい         ...
Whats the Benefit?                    => イテレータが用意出来れば、どIntroduction                ●  Whats  Benefit                    んな...
Whats the Benefit?                    プログラムの中にはたくさんのデーIntroduction                ●  Whats  Benefit           タ型と、たくさんのクラス...
Whats the Benefit?                    それら全てに対応するプログラムをIntroduction                ●  Whats  Benefit           書くとすると、i * j...
Whats the Benefit?                    テンプレートを使って、Introduction                ●  Whats  Benefit           ●                ...
Whats the Benefit?                    オブジェクト指向では継承によっIntroduction                ●  Whats  Benefit           て、クラス定義を再利用する...
Whats the Benefit?                    テンプレートを使うことで、ジェネIntroduction                ●  Whats  Benefit           リックプログラミングが可...
Whats the Benefit?                    テンプレートを使用して嬉しいことIntroduction                ●  Whats  Benefit           は、これだけじゃない。H...
Whats the Benefit?Introduction  Whats                          template<class T>                          template<class T...
Whats the Benefit?Introduction  Whats                          template<class T>                          template<class T...
Whats the Benefit?Introduction  Whats                          template<class T>                          template<class T...
Whats the Benefit?Introduction  Whats                          template<class T>                          template<class T...
Whats the Benefit?Introduction                    クラス名<テンプレート引数>::type                    クラス名<テンプレート引数>::type  Whats  Ben...
Whats the Benefit?Introduction                    クラス名<テンプレート引数>::type                    クラス名<テンプレート引数>::type  Whats  Ben...
Whats the Benefit?                    これをこじらせると^H^H^H^H^H^HIntroduction                ●  Whats  Benefit                  ...
Whats the Template?namespace mpl = boost::mpl;typedef    mpl::vector<int, std::string, user_defined_type>seq1;typedef    m...
Whats the Benefit?                    これをこじらせると^H^H^H^H^H^HIntroduction                ●  Whats  Benefit                  ...
Whats the Benefit?                    その他、テンプレートを使うことでIntroduction                ●  Whats  Benefit           可能になる、便利なテクニ...
Whats the Benefit?                    ポリシークラスIntroduction                ●  Whats                    クラスの挙動をテンプレートで差し  Ben...
Whats the Benefit?template<class Policy>struct logger{    //なんかいろいろなコンストラクタなど      void output(char const *msg) {         ...
Whats the Benefit?strict cout_policy{    static void output(char const *msg) {        std::cout << msg << std::endl;    }}...
Whats the Benefit?                    ポリシークラスIntroduction                ●  Whats  BenefitHow to use                void f...
Whats the Benefit?                    ポリシークラスIntroduction                ●  Whats  BenefitHow to use                void f...
Whats the Benefit?Introduction  Whats                ●   loggerを継承したりすることな  Benefit                    く、loggerの挙動を変更することが...
Whats the Benefit?Introduction  Whats                ●   loggerは受け取りたいポリシーに  Benefit                    outputという名前のstatic...
Whats the Benefit?Introduction  Whats                ●   policyはloggerが必要とする要件にし  Benefit                    か依存していない。How ...
Whats the Benefit?                    その他、テンプレートを使うことでIntroduction                ●  Whats  Benefit           可能になる、便利なテクニ...
How to use the Template.11/12/13            関数型都市忘年会          72
How to use the Template.                    テンプレートの使い方/書き方Introduction                ●  Whats                          クラ...
How to use the Template.                    クラステンプレートの使い方Introduction                ●  Whats  BenefitHow to useConclusion...
How to use the Template.                    クラステンプレートの使い方Introduction                ●  Whats  BenefitHow to use          ...
How to use the Template.                    クラステンプレートの使い方Introduction                ●  Whats  BenefitHow to use          ...
How to use the Template.                    クラステンプレートの使い方Introduction                ●  Whats  BenefitHow to use          ...
How to use the Template.                    クラステンプレートの使い方Introduction                ●  Whats  BenefitHow to use          ...
How to use the Template.                    クラステンプレートの書き方Introduction                ●  Whats  BenefitHow to use          ...
How to use the Template.                    クラステンプレートの書き方Introduction                ●  Whats  BenefitHow to use          ...
How to use the Template.                    クラステンプレートの書き方Introduction                ●  Whats  BenefitHow to use          ...
How to use the Template.                    クラステンプレートの書き方Introduction                ●  Whats  Benefit                 typ...
How to use the Template.                    クラステンプレートの書き方Introduction                ●  Whats                    もし、クラステンプ...
How to use the Template.                    クラステンプレートの書き方Introduction                ●  Whats                    これで、先程のde...
How to use the Template.                    クラステンプレートの書き方Introduction                ●  Whats                    複数のテンプレート...
How to use the Template.                    クラステンプレートの書き方Introduction                ●  Whats                    もっとも後ろのテン...
How to use the Template.                    関数テンプレートの使い方Introduction                ●  Whats  BenefitHow to useConclusion ...
How to use the Template.                    関数テンプレートの使い方Introduction                ●  Whats  BenefitHow to useConclusion ...
How to use the Template.                    関数テンプレートの使い方Introduction                ●  Whats  BenefitHow to useConclusion ...
How to use the Template.                    関数テンプレートの使い方Introduction                ●  Whats                    引数からテンプレート...
How to use the Template.                    関数テンプレートの書き方Introduction                ●  Whats  BenefitHow to use           ...
How to use the Template.                    関数テンプレートの書き方Introduction                ●  Whats  BenefitHow to use           ...
Conclusion11/12/13     関数型都市忘年会   93
ConclusionIntroduction  Whats                ●   C++のテンプレートはとても便利  Benefit                    で、実行時効率を損なうこと無く、How to use  ...
ConclusionIntroduction  Whats                ●   C++11になって、C++のテンプレー  Benefit                    トはより便利になります(可変長テン        ...
Conclusion                    参考文献/サイトIntroduction                ●  Whats  Benefit           ●                          「...
Thank You!           ありがとうございました!11/12/13       関数型都市忘年会   97
ちなみに。                    この資料でやり残してること。Introduction                ●  Whats  BenefitHow to use                    ●     ty...
Upcoming SlideShare
Loading in...5
×

C++ template-primer

2,155

Published on

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

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,155
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
19
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

C++ template-primer

  1. 1. C++ テンプレート入門 @hotwatermorning11/12/13 関数型都市忘年会 1
  2. 2. 自己紹介● @hotwatermorning● C++でプログラム書いてます。11/12/13 関数型都市忘年会 2
  3. 3. 自己紹介● Boost.勉強会 #6 札幌を開催しました!11/12/13 関数型都市忘年会 3
  4. 4. Introduction11/12/13 関数型都市忘年会 4
  5. 5. Introduction 今日のお話Introduction ● Whats BenefitHow to use ● C++テンプレート入門Conclusion ● C++のテンプレートという仕組みを 紹介します 11/12/13 関数型都市忘年会 5
  6. 6. Introduction 主な対象者Introduction ● Whats BenefitHow to use ● C++や、Cライクな文法の言語をConclusion 触ったことがある人 ● テンプレートは使いこなしていない けど興味がある人 ● テンプレートとか日常的に使いこな してるけど、発表をひやかしたい人 11/12/13 関数型都市忘年会 6
  7. 7. Introduction 〜 本日のレシピ 〜Introduction Whats BenefitHow to use ● Whats the Template?Conclusion ● テンプレートとは? ● Whats the Benefit? ● テンプレートを使うと何が嬉しい? ● How to use the Template. ● テンプレートの使い方/書き方 11/12/13 関数型都市忘年会 7
  8. 8. Whats the Template?11/12/13 関数型都市忘年会 8
  9. 9. Whats the Template? テンプレートとは?Introduction ● Whats BenefitHow to use ● C++の言語機能の一つConclusion ● 1990年7月の会議でC++の規格に取り込まれ た。 ● 型を差し替え可能なクラスや関数を 書くことが出来る仕組み。 ● 型とデータ構造とアルゴリズムを 分離できる ● →コードの再利用性が高い 11/12/13 関数型都市忘年会 9
  10. 10. Whats the Template? 元々の要望は、コンテナの格納できIntroduction ● Whats Benefit る方をパラメータ化したいというこHow to useConclusion とから ● 標準ライブラリには柔軟で効率のいいコン テナが必要 ● intを格納する動的配列 ● 浮動小数点数を格納する線形リスト ● intからstringへの連想配列、などなど ● C with Classes(C++の前身)の頃は マクロで対処していた 11/12/13 関数型都市忘年会 10
  11. 11. 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
  12. 12. 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
  13. 13. 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
  14. 14. 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
  15. 15. Whats the Template? マクロの問題点Introduction ● Whats BenefitHow to useConclusion ● マクロはただのテキスト処理 ● スコープの概念もない ● かの有名なmin/maxマクロ(in windows.h) ● コンパイラサポートがない ● 型安全ではない ● 型推論も出来ない 11/12/13 関数型都市忘年会 15
  16. 16. Whats the Template? マクロの問題点Introduction ● Whats BenefitHow to useConclusion ● 文法がC++のソースと違う。厄介で 面倒でバグのもと ● 複数行のマクロを書こうと思うと末尾の行 の結合が必要 ● 引数をカッコで括る必要が有ったりなかっ たり ● 引数が何度も評価されてしまったり 11/12/13 関数型都市忘年会 16
  17. 17. 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
  18. 18. Whats the Template? マクロではなく、Introduction ● Whats ちゃんと言語機能として BenefitHow to useConclusion サポートしようという風になった。 11/12/13 関数型都市忘年会 18
  19. 19. Whats the Template?Introduction Whats ● Stroustrupが選んだ設計方針案 BenefitHow to use ● Smalltalk風 動的typingと継承を使うConclusion ● ● Clu風 ● 静的typingと、引数で型を指定できる仕組み を使う ● 前者はランタイムコストが大きく、 また静的型付け言語であるC++のや り方と相容れない。 11/12/13 関数型都市忘年会 19
  20. 20. Whats the Template?Introduction Whats ● Stroustrupが選んだ設計方針案 BenefitHow to use ● Smalltalk風 動的typingと継承を使うConclusion ● ● Clu風 ● 静的typingと、引数で型を指定できる仕組み を使う ● 前者はランタイムコストが大きく、 また静的型付け言語であるC++のや り方と相容れない。=> 後者を採用 11/12/13 関数型都市忘年会 20
  21. 21. Whats the Template?Introduction Whats ● Stroustrupが選んだ設計方針案 BenefitHow to use ● Stroustrup曰く 「理想的には、C++はCluの方法にConclusion 基づき、ランタイムとスペース効率 が良く、コンパイル時のオーバー ヘッドも少ない仕組みを実現した い、また柔軟性は、Smalltalkのよう に大きくなければならない」 (D&E第一版 15.2 P.431) 11/12/13 関数型都市忘年会 21
  22. 22. Whats the Template? そうして出来上がったのが今のテンIntroduction ● Whats Benefit プレートHow to useConclusion 11/12/13 関数型都市忘年会 22
  23. 23. Whats the Template?template<class T>class ClassA{ T value_;};template<class T>int FunctionB(T arg){ arg.get_value();}11/12/13 関数型都市忘年会 23
  24. 24. 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
  25. 25. 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
  26. 26. Whats the Template? こんな感じで使えるという例Introduction ● Whats BenefitHow to useConclusion 11/12/13 関数型都市忘年会 26
  27. 27. 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
  28. 28. 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
  29. 29. 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
  30. 30. 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
  31. 31. Whats the Template? もうひとつの例Introduction ● Whats BenefitHow to useConclusion ● 二つの変数が与えられたときに、比 較して小さい方を返す。 11/12/13 関数型都市忘年会 31
  32. 32. 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
  33. 33. Whats the Template? マクロはあんまり良くないので、関Introduction ● Whats Benefit 数で書きたい でも、こんな汎用的な処理を色んなHow to use ●Conclusion 型のバージョンで分けて書いていら れない(そもそもユーザー定義型に も対応したい) 11/12/13 関数型都市忘年会 33
  34. 34. Whats the Template? 比較可能であることを表す、Introduction ● Whats Benefit IComparableから派生したクラスのHow to useConclusion 変数だけを受け取って、仮想関数 compareで比較する? ● POD型に対応できない。 ● 比較するだけで仮想関数の仕組みを使わな くてはいけないのは嬉しくない。 11/12/13 関数型都市忘年会 34
  35. 35. 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
  36. 36. 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
  37. 37. Whats the Benefit?11/12/13 関数型都市忘年会 37
  38. 38. Whats the Benefit? テンプレートがあることで嬉しいこIntroduction ● Whats Benefit とはなにか? => テンプレートはコードの再利用How to use ●Conclusion 性を高める 11/12/13 関数型都市忘年会 38
  39. 39. Whats the Benefit? テンプレートはクラスと関数の型をIntroduction ● Whats Benefit パラメータ化する仕組み 型をパラメータ化することで、クラHow to use ●Conclusion スと関数を型と分離して書くことが 出来る。 11/12/13 関数型都市忘年会 39
  40. 40. Whats the Benefit? 型をパラメータ化したコンテナIntroduction ● Whats BenefitHow to use ● std::vector, std::list, std::map,Conclusion std::queue, etc... ● 型がAssignableであるなど、いくつ かの要件を満たすものであれば、何 でもこれらコンテナに渡すことが出 来る。 11/12/13 関数型都市忘年会 40
  41. 41. 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
  42. 42. 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
  43. 43. 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
  44. 44. 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
  45. 45. Whats the Benefit? アルゴリズムは値の列を辿って何かIntroduction ● Whats Benefit したい => コンテナなどを直接触らないで、How to useConclusion ● イテレータと呼ばれる小さなクラス に、コンテナから要素を参照する処 理を委譲。 ● => アルゴリズムは、イテレータをテ ンプレートにすることで、イテレー タの要件を満たす型を受け付けるよ うにする。 11/12/13 関数型都市忘年会 45
  46. 46. Whats the Benefit? => イテレータが用意出来れば、どIntroduction ● Whats Benefit んなコンテナや、値の列であってHow to use も、それをアルゴリズムに対して使 用できるようになる。Conclusion ● ポインタもイテレータの要件を満たす ● というより、C++のイテレータは、ポインタ を参考にして作られた。 11/12/13 関数型都市忘年会 46
  47. 47. Whats the Benefit? プログラムの中にはたくさんのデーIntroduction ● Whats Benefit タ型と、たくさんのクラスと、たくHow to useConclusion さんの関数がある。 ● とあるプログラムの中の 型の数をi、クラスの数をj、そしてア ルゴリズムの数をkで表すとする。 11/12/13 関数型都市忘年会 47
  48. 48. Whats the Benefit? それら全てに対応するプログラムをIntroduction ● Whats Benefit 書くとすると、i * j * k個の組み合わHow to useConclusion せに対応しないといけない。 11/12/13 関数型都市忘年会 48
  49. 49. Whats the Benefit? テンプレートを使って、Introduction ● Whats Benefit ● 型とコンテナ、How to useConclusion ● 型とアルゴリズム、 ● コンテナとアルゴリズム ● を分離すれば、それぞれ、型をiだ け、コンテナをjだけ、アルゴリズム をkだけ用意すればいい。 ● つまりi + j + kで済む。 11/12/13 関数型都市忘年会 49
  50. 50. Whats the Benefit? オブジェクト指向では継承によっIntroduction ● Whats Benefit て、クラス定義を再利用することがHow to useConclusion 可能になった。 ● C++のテンプレートでは、型をパラ メータ化することで、クラス定義の 再利用を可能にした。ついでにオブ ジェクト指向では不可能だった、関 数の再利用も可能にした。 11/12/13 関数型都市忘年会 50
  51. 51. Whats the Benefit? テンプレートを使うことで、ジェネIntroduction ● Whats Benefit リックプログラミングが可能になっHow to useConclusion た。 ● ジェネリックプログラミング。 ● 「型を決定していないクラスや関数 の断片を用意しておき、それらの組 み合わせでプログラミングをする」 (C++テンプレートテクニック 第一版 P.51) 11/12/13 関数型都市忘年会 51
  52. 52. Whats the Benefit? テンプレートを使用して嬉しいことIntroduction ● Whats Benefit は、これだけじゃない。How to useConclusion ● クラスがテンプレート化出来るとい うことは、さらに重要な意味を持 つ。 ● => メタ関数 ● => Template Meta Programming 11/12/13 関数型都市忘年会 52
  53. 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<int>::type add_const<int>::type ● という型はint constになる。 ● charをテンプレート引数に渡せばchar const に。std::stringならstd::string constに。 11/12/13 関数型都市忘年会 53
  54. 54. 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
  55. 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<int>::type add_pointer<int>::type ● という型はint *になる。 ● charをテンプレート引数に渡せばchar * に。std::stringならstd::string *に。 11/12/13 関数型都市忘年会 55
  56. 56. 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
  57. 57. Whats the Benefit?Introduction クラス名<テンプレート引数>::type クラス名<テンプレート引数>::type Whats BenefitHow to useConclusion ● クラス名を関数名、テンプレート引 数を引数、typeを戻り値の選択とい う風に捉えると、関数のように考え ることが出来る。 11/12/13 関数型都市忘年会 57
  58. 58. Whats the Benefit?Introduction クラス名<テンプレート引数>::type クラス名<テンプレート引数>::type Whats BenefitHow to useConclusion ● クラス名を関数名、テンプレート引 数を引数、typeを戻り値の選択とい う風に捉えると、関数のように考え ることが出来る。 ● 通常の関数と違い、型に関する操作 が基本。 ● => Template Meta Programming 11/12/13 関数型都市忘年会 58
  59. 59. Whats the Benefit? これをこじらせると^H^H^H^H^H^HIntroduction ● Whats Benefit 発展させるとどうなるかHow to useConclusion 11/12/13 関数型都市忘年会 59
  60. 60. 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
  61. 61. 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
  62. 62. Whats the Benefit? その他、テンプレートを使うことでIntroduction ● Whats Benefit 可能になる、便利なテクニックHow to useConclusion ● ポリシークラス – クラスの挙動をテンプレートで差し替える ● パラメータ化継承 – 継承関係をテンプレートで差し替える ● CRTP – 静的多態 ● タグディスパッチ – 静的オーバーロード ● SFINAE – 静的オーバーロード 11/12/13 関数型都市忘年会 62
  63. 63. Whats the Benefit? ポリシークラスIntroduction ● Whats クラスの挙動をテンプレートで差し Benefit ● 替えるHow to useConclusion 11/12/13 関数型都市忘年会 63
  64. 64. Whats the Benefit?template<class Policy>struct logger{ //なんかいろいろなコンストラクタなど void output(char const *msg) { Policy::output(msg); } //なんかいろいろなメンバ関数};11/12/13 関数型都市忘年会 64
  65. 65. 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
  66. 66. 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
  67. 67. 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
  68. 68. Whats the Benefit?Introduction Whats ● loggerを継承したりすることな Benefit く、loggerの挙動を変更することが 出来るHow to useConclusion 11/12/13 関数型都市忘年会 68
  69. 69. 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
  70. 70. 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
  71. 71. Whats the Benefit? その他、テンプレートを使うことでIntroduction ● Whats Benefit 可能になる、便利なテクニック 多分ここらへんが聞いてて一番面白How to use ●Conclusion くなるはずのところですが残念なが ら資料ができていませんごめんなさ い。 11/12/13 関数型都市忘年会 71
  72. 72. How to use the Template.11/12/13 関数型都市忘年会 72
  73. 73. How to use the Template. テンプレートの使い方/書き方Introduction ● Whats クラステンプレート Benefit ●How to useConclusion ● 関数テンプレート 11/12/13 関数型都市忘年会 73
  74. 74. How to use the Template. クラステンプレートの使い方Introduction ● Whats BenefitHow to useConclusion 11/12/13 関数型都市忘年会 74
  75. 75. 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
  76. 76. 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
  77. 77. 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
  78. 78. 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
  79. 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 { /*ごにょごにょ*/ }; { /*ごにょごにょ*/ }; ● 普通のクラス定義の直前に template<class T>のようにして、パ ラメータ化する型を書く 11/12/13 関数型都市忘年会 79
  80. 80. 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
  81. 81. 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
  82. 82. 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
  83. 83. 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
  84. 84. 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
  85. 85. 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
  86. 86. 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
  87. 87. How to use the Template. 関数テンプレートの使い方Introduction ● Whats BenefitHow to useConclusion 11/12/13 関数型都市忘年会 87
  88. 88. 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
  89. 89. 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
  90. 90. How to use the Template. 関数テンプレートの使い方Introduction ● Whats 引数からテンプレートの型が推論で Benefit ● きる場合は、テンプレート引数を指How to useConclusion 定する必要はない。 11/12/13 関数型都市忘年会 90
  91. 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 関数型都市忘年会 91
  92. 92. 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
  93. 93. Conclusion11/12/13 関数型都市忘年会 93
  94. 94. ConclusionIntroduction Whats ● C++のテンプレートはとても便利 Benefit で、実行時効率を損なうこと無く、How to use 柔軟で再利用性の高いコードを書く ことが出来る仕組みです。Conclusion 11/12/13 関数型都市忘年会 94
  95. 95. ConclusionIntroduction Whats ● C++11になって、C++のテンプレー Benefit トはより便利になります(可変長テン プレートなど)How to useConclusion ● 普段C++を使っていて、テンプレー トをあまり使ったことがない人がい たら、ぜひテンプレートに手を出し てみてはいかがでしょうか。 11/12/13 関数型都市忘年会 95
  96. 96. 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
  97. 97. Thank You! ありがとうございました!11/12/13 関数型都市忘年会 97
  98. 98. ちなみに。 この資料でやり残してること。Introduction ● Whats BenefitHow to use ● typenameキーワードConclusion ● template限定子 ● CRTPなどの紹介 ● 関数テンプレートの使い方と型推 論の紹介 11/12/13 関数型都市忘年会 98
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×