Enviar pesquisa
Carregar
What is template
•
13 gostaram
•
2,868 visualizações
Akira Takahashi
Seguir
Denunciar
Compartilhar
Denunciar
Compartilhar
1 de 32
Baixar agora
Baixar para ler offline
Recomendados
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
Akira Takahashi
error handling using expected
error handling using expected
Akira Takahashi
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
Kohsuke Yuasa
templateとautoの型推論
templateとautoの型推論
MITSUNARI Shigeo
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
natrium11321
Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4
Takashi Hoshino
C++0x in programming competition
C++0x in programming competition
yak1ex
Emcpp item31
Emcpp item31
mitsutaka_takeda
Recomendados
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
Akira Takahashi
error handling using expected
error handling using expected
Akira Takahashi
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
Kohsuke Yuasa
templateとautoの型推論
templateとautoの型推論
MITSUNARI Shigeo
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
natrium11321
Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4
Takashi Hoshino
C++0x in programming competition
C++0x in programming competition
yak1ex
Emcpp item31
Emcpp item31
mitsutaka_takeda
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
Hibiki Yamashiro
C++入門?
C++入門?
tsudaa
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Shintarou Okada
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
Fujio Kojima
C# 8.0 null許容参照型
C# 8.0 null許容参照型
信之 岩永
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61
TATSUYA HAYAMIZU
C++ Template Metaprogramming
C++ Template Metaprogramming
Akira Takahashi
C++0x 言語の未来を語る
C++0x 言語の未来を語る
Akira Takahashi
Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12
Keisuke Fukuda
メタプログラミング C#
メタプログラミング C#
Fujio Kojima
Map
Map
kikairoya
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
Template Meta Programming入門から応用まで
Template Meta Programming入門から応用まで
yoshihikoozaki5
C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0
信之 岩永
Emcpp0506
Emcpp0506
Takatoshi Kondo
C#6.0の新機能紹介
C#6.0の新機能紹介
Kazunori Hamamoto
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
Visual C++で使えるC++11
Visual C++で使えるC++11
nekko1119
知って得するC#
知って得するC#
Shota Baba
オブジェクト指向入門7
オブジェクト指向入門7
Kenta Hattori
C++0x Variadic Type List
C++0x Variadic Type List
Akira Takahashi
C++1z draft
C++1z draft
Akira Takahashi
Mais conteúdo relacionado
Mais procurados
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
Hibiki Yamashiro
C++入門?
C++入門?
tsudaa
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Shintarou Okada
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
Fujio Kojima
C# 8.0 null許容参照型
C# 8.0 null許容参照型
信之 岩永
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61
TATSUYA HAYAMIZU
C++ Template Metaprogramming
C++ Template Metaprogramming
Akira Takahashi
C++0x 言語の未来を語る
C++0x 言語の未来を語る
Akira Takahashi
Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12
Keisuke Fukuda
メタプログラミング C#
メタプログラミング C#
Fujio Kojima
Map
Map
kikairoya
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
Template Meta Programming入門から応用まで
Template Meta Programming入門から応用まで
yoshihikoozaki5
C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0
信之 岩永
Emcpp0506
Emcpp0506
Takatoshi Kondo
C#6.0の新機能紹介
C#6.0の新機能紹介
Kazunori Hamamoto
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
Visual C++で使えるC++11
Visual C++で使えるC++11
nekko1119
知って得するC#
知って得するC#
Shota Baba
オブジェクト指向入門7
オブジェクト指向入門7
Kenta Hattori
Mais procurados
(20)
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
C++入門?
C++入門?
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 8.0 null許容参照型
C# 8.0 null許容参照型
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61
C++ Template Metaprogramming
C++ Template Metaprogramming
C++0x 言語の未来を語る
C++0x 言語の未来を語る
Effective modern C++ 勉強会 #3 Item 12
Effective modern C++ 勉強会 #3 Item 12
メタプログラミング C#
メタプログラミング C#
Map
Map
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Template Meta Programming入門から応用まで
Template Meta Programming入門から応用まで
C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0
Emcpp0506
Emcpp0506
C#6.0の新機能紹介
C#6.0の新機能紹介
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Visual C++で使えるC++11
Visual C++で使えるC++11
知って得するC#
知って得するC#
オブジェクト指向入門7
オブジェクト指向入門7
Destaque
C++0x Variadic Type List
C++0x Variadic Type List
Akira Takahashi
C++1z draft
C++1z draft
Akira Takahashi
La cuestión del presupuesto nacional para educación 2013
La cuestión del presupuesto nacional para educación 2013
Laura Marrone
Using Web Analytics Insights To Sell More
Using Web Analytics Insights To Sell More
Dennis Mortensen
9845312548-Dashboard-Guide
9845312548-Dashboard-Guide
Adam Corum
Social Media for Atlantic Canada Marketing
Social Media for Atlantic Canada Marketing
MediaBadger
Laura's_Cardona_ Portfolio2015
Laura's_Cardona_ Portfolio2015
Laura Cardona
Календари портфолио
Календари портфолио
Виктор Курсалин
Making Connections : A talk on mobile engagement for UNICEF Japan
Making Connections : A talk on mobile engagement for UNICEF Japan
Younghee Jung
Steve Rice Los Gatos: Financial Tips For Recent College Graduates
Steve Rice Los Gatos: Financial Tips For Recent College Graduates
Steve Rice Los Gatos
Magnetismo2 3
Magnetismo2 3
clausgon
Market research analysis 2
Market research analysis 2
mcgowanjhhs1
Задачі
Задачі
Roman Lavriv
Cross references
Cross references
Roslina Ahmad
Tandoori chicken
Tandoori chicken
DLSU-CEFIW
CV 2015
CV 2015
Stephanie Butler
Global agriculture market drivers and outlook 2014
Global agriculture market drivers and outlook 2014
ipga
Sustainia
Sustainia
Rafat Ali
Ubuntu migration at Zaragoza City Council v3
Ubuntu migration at Zaragoza City Council v3
Eduardo Romero Moreno
How to succeed at hiring without really trying
How to succeed at hiring without really trying
Melinda Seckington
Destaque
(20)
C++0x Variadic Type List
C++0x Variadic Type List
C++1z draft
C++1z draft
La cuestión del presupuesto nacional para educación 2013
La cuestión del presupuesto nacional para educación 2013
Using Web Analytics Insights To Sell More
Using Web Analytics Insights To Sell More
9845312548-Dashboard-Guide
9845312548-Dashboard-Guide
Social Media for Atlantic Canada Marketing
Social Media for Atlantic Canada Marketing
Laura's_Cardona_ Portfolio2015
Laura's_Cardona_ Portfolio2015
Календари портфолио
Календари портфолио
Making Connections : A talk on mobile engagement for UNICEF Japan
Making Connections : A talk on mobile engagement for UNICEF Japan
Steve Rice Los Gatos: Financial Tips For Recent College Graduates
Steve Rice Los Gatos: Financial Tips For Recent College Graduates
Magnetismo2 3
Magnetismo2 3
Market research analysis 2
Market research analysis 2
Задачі
Задачі
Cross references
Cross references
Tandoori chicken
Tandoori chicken
CV 2015
CV 2015
Global agriculture market drivers and outlook 2014
Global agriculture market drivers and outlook 2014
Sustainia
Sustainia
Ubuntu migration at Zaragoza City Council v3
Ubuntu migration at Zaragoza City Council v3
How to succeed at hiring without really trying
How to succeed at hiring without really trying
Semelhante a What is template
Lambda in template_final
Lambda in template_final
Cryolite
Learning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.Geomtry
Akira Takahashi
C++0x concept
C++0x concept
Akira Takahashi
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
Genya Murakami
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
Preferred Networks
Boost.Flyweight
Boost.Flyweight
gintenlabo
Xtext 紹介
Xtext 紹介
Akira Tanaka
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
Hiro H.
“Design and Implementation of Generics for the .NET Common Language Runtime”他...
“Design and Implementation of Generics for the .NET Common Language Runtime”他...
Masahiro Sakai
Boost Fusion Library
Boost Fusion Library
Akira Takahashi
研究生のためのC++ no.4
研究生のためのC++ no.4
Tomohiro Namba
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
Kohsuke Yuasa
C++ lecture-0
C++ lecture-0
sunaemon
C# 8
C# 8
m ishizaki
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
Fujio Kojima
研究生のためのC++ no.2
研究生のためのC++ no.2
Tomohiro Namba
Final LINQ Extensions
Final LINQ Extensions
Kouji Matsui
多相な関数の定義から学ぶ、型クラスデザインパターン
多相な関数の定義から学ぶ、型クラスデザインパターン
Taisuke Oe
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Akira Inoue
初心者講習会資料(Osaka.R#7)
初心者講習会資料(Osaka.R#7)
Masahiro Hayashi
Semelhante a What is template
(20)
Lambda in template_final
Lambda in template_final
Learning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.Geomtry
C++0x concept
C++0x concept
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
Boost.Flyweight
Boost.Flyweight
Xtext 紹介
Xtext 紹介
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
“Design and Implementation of Generics for the .NET Common Language Runtime”他...
“Design and Implementation of Generics for the .NET Common Language Runtime”他...
Boost Fusion Library
Boost Fusion Library
研究生のためのC++ no.4
研究生のためのC++ no.4
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
C++ lecture-0
C++ lecture-0
C# 8
C# 8
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
研究生のためのC++ no.2
研究生のためのC++ no.2
Final LINQ Extensions
Final LINQ Extensions
多相な関数の定義から学ぶ、型クラスデザインパターン
多相な関数の定義から学ぶ、型クラスデザインパターン
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
初心者講習会資料(Osaka.R#7)
初心者講習会資料(Osaka.R#7)
Mais de Akira Takahashi
Cpp20 overview language features
Cpp20 overview language features
Akira Takahashi
Cppmix 02
Cppmix 02
Akira Takahashi
Cppmix 01
Cppmix 01
Akira Takahashi
Modern C++ Learning
Modern C++ Learning
Akira Takahashi
cpprefjp documentation
cpprefjp documentation
Akira Takahashi
Boost tour 1_61_0 merge
Boost tour 1_61_0 merge
Akira Takahashi
Boost tour 1_61_0
Boost tour 1_61_0
Akira Takahashi
Boost tour 1.60.0 merge
Boost tour 1.60.0 merge
Akira Takahashi
Boost tour 1.60.0
Boost tour 1.60.0
Akira Takahashi
Boost container feature
Boost container feature
Akira Takahashi
Boost Tour 1_58_0 merge
Boost Tour 1_58_0 merge
Akira Takahashi
Boost Tour 1_58_0
Boost Tour 1_58_0
Akira Takahashi
C++14 solve explicit_default_constructor
C++14 solve explicit_default_constructor
Akira Takahashi
C++14 enum hash
C++14 enum hash
Akira Takahashi
Multi paradigm design
Multi paradigm design
Akira Takahashi
Start Concurrent
Start Concurrent
Akira Takahashi
Programmer mind
Programmer mind
Akira Takahashi
Boost.Study 14 Opening
Boost.Study 14 Opening
Akira Takahashi
Executors and schedulers
Executors and schedulers
Akira Takahashi
Improvement future api
Improvement future api
Akira Takahashi
Mais de Akira Takahashi
(20)
Cpp20 overview language features
Cpp20 overview language features
Cppmix 02
Cppmix 02
Cppmix 01
Cppmix 01
Modern C++ Learning
Modern C++ Learning
cpprefjp documentation
cpprefjp documentation
Boost tour 1_61_0 merge
Boost tour 1_61_0 merge
Boost tour 1_61_0
Boost tour 1_61_0
Boost tour 1.60.0 merge
Boost tour 1.60.0 merge
Boost tour 1.60.0
Boost tour 1.60.0
Boost container feature
Boost container feature
Boost Tour 1_58_0 merge
Boost Tour 1_58_0 merge
Boost Tour 1_58_0
Boost Tour 1_58_0
C++14 solve explicit_default_constructor
C++14 solve explicit_default_constructor
C++14 enum hash
C++14 enum hash
Multi paradigm design
Multi paradigm design
Start Concurrent
Start Concurrent
Programmer mind
Programmer mind
Boost.Study 14 Opening
Boost.Study 14 Opening
Executors and schedulers
Executors and schedulers
Improvement future api
Improvement future api
What is template
1.
Template <Programming>
ー テンプレートとは何か ー 高橋 晶(Akira Takahashi) id:faith_and_brave / @cpp_akira 2012/11/23 Effective C++読書会 vol.11 大阪~第7章特別編~
2.
自己紹介 • Boost.勉強会 東京の主催者 •
boostjp/cpprefjpサイトを作ってます • 著書 – 『C++テンプレートテクニック』 – 『プログラミングの魔導書 Vol.1 ~Construct the World, C++~』
3.
自己紹介
4.
本日のお題 1.
テンプレート入門 2. どんな場面で使用するか 3. テンプレート技法 4. 未来
5.
Chapter 01 テンプレート入門 Introduction to
Templates
6.
テンプレートとは何か • 日本語では「雛形」 • 型のパラメータ化によってコードの共通化を行う •
基本的な目的: – 任意のデータ型のオブジェクトを格納できるコンテナ – データ型に依存しないアルゴリズム
7.
任意の型のオブジェクトを格納できるコンテナ 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_; } };
8.
任意の型のオブジェクトを格納できるコンテナ 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; }
9.
データ型に依存しないアルゴリズム 以下の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に置き換えられる
10.
クラステンプレート クラス内で扱う型をパラメータ化する template <class T> class
X { // T型が内部で持っている型を取得する using value_type = typename T::value_type; void f(const T& x) { x.member(); // メンバ変数/関数を使用する T temp = T(); // パラメータ型のオブジェクトを構築する } }; X<Y> object; object.f(y_object); ※T()というコンストラクタ呼び出し構文を許可するために、intや charのような組み込み型にもコンストラクタ構文が使えるようになっている
11.
関数テンプレート 関数内で扱う型をパラメータ化する template <class T> void
f(const T& x) { …同じく型Tのメンバや型を使用できる… } X x; f(x); // オブジェクトxの型XでTが置き換えられる Y y; f<Y>(y); // 明示的な型指定も可能 クラステンプレートと違い、関数テンプレートの型は引数として 渡されたオブジェクトから推論される
12.
可変引数テンプレート 任意個数のテンプレートパラメータを扱う機能(C++11) void printValues() {} template
<class X, class... XS> void printValues(X x, XS... xs) { // 先頭とそれ以外に分ける std::cout << x << std::endl; // 先頭要素を出力 printValues(xs...); // 残りを出力 } printValues(1, 'a', "hello");
13.
テンプレートの特殊化 特殊化には、完全特殊化と部分特殊化の2種類がある 1.
完全特殊化は、汎用的なものとは別に、特定の型に対する特殊バー ジョンを定義する 2. 部分特殊化は、特定のパターンに一致する型に対する特殊バージョン を定義する template <class T> // 汎用的な処理 struct X { void f() {} }; template <> struct X<int> { void f() {} }; // intに対する完全特殊化 template <class T> struct X<T*> { void f() {} }; // ポインタ型に対する部分特殊化 完全特殊化はクラステンプレートと関数テンプレートで使用でき、 部分特殊化はクラステンプレートで使用できる
14.
デフォルトテンプレート引数 クラステンプレートと関数テンプレートには、それぞれデフォルト の型を指定できる(関数テンプレートはC++11から) template <class T
= void> class X; template <class Option = nothing> void f();
15.
非型テンプレートパラメータ テンプレートパラメータには、型だけでなく値も指定できる。 指定できるのは、整数型(int, char, enum,
…)、および外部リンケージを持つ オブジェクトへのポインタと参照。 template <size_t N> class X { static constexpr int size = N; int ar[size]; } X<3> x; for (size_t i = 0; i < x.size; ++i) x.ar[i] …;
16.
エイリアステンプレート テンプレートを使用して型に別名を付ける(C++11から) typedef templateとも言える // アロケータだけ先に設定しておく template
<class T> using vec = std::vector<T, stack_allocator<T>>; vec<int> v; ※特殊化はできない
17.
Chapter 02 どんな場面で使用するか
Use Situations
18.
テンプレートをどんな場面で使用するか ここでは、テンプレートを使用するにあたっての指針を示す テンプレートの適用場面は、大きく3つに分類できる: 1. 同じ意味論とインタフェースを持つ値を一様に扱う 2. クラス・関数の内部操作をコンパイル時に切り替える 3.
実行時エラーを阻止する
19.
同じ意味論とインタフェース持つ値を
一様に扱いたい場面で使用する 同じ意味を持つ操作に共通インタフェースを持たせて、同じよう に扱う class Title { void update(); void draw(); }; class Quest { void update(); void draw(); }; template <class Scene> void updateGame(Scene& scene) { scene.update(); scene.draw(); }
20.
クラス・関数の内部操作をコンパイル時に切り替える 内部のアルゴリズムが違う以外は同じインタフェースで使える、 という場合に使用する。内部戦略のパラメータ化。 struct NonePolicy
{ static void print(int x) {} }; struct PrintPolicy { static void print(int x) { /*標準出力へ*/ } }; struct LoggingPolicy { static void print(int x) { /*ファイルへ*/ } }; template <class OutputPolicy> class X { int value_ = 0; public: void f(int add) { value_ += add; OutputPolicy::print(value); } };
21.
実行時エラーを阻止する 場面によってやり方は様々だが、static assertのようなものと組み合わ せることで、コンパイル時に正当性チェックを行う。 ここでは、strong typedefのためにテンプレートを使用する例を示す。 //
タグ付き浮動小数点数型(タグが異なれば型が異なるので変換できなくなる) template <class FloatingPoint, class Tag> class tagged_real { FloatingPoint value_; public: tagged_real(FloatingPoint value = 0) : value_(value) {} FloatingPoint& get() { return value_; } }; struct degree {}; // 空クラス struct radian {}; tagged_real<float, degree> deg(90.0f); tagged_real<float, radian> rad = deg; // コンパイルエラー!型が違う https://github.com/faithandbrave/Shand/blob/master/libs/strong_typedef/tagged_real_example.cpp
22.
いつでもテンプレート • テンプレートは小難しい機能でライブラリを書く人だけ知って
いればいい、というものではない • テンプレートはとても広く一般的に使うもので、関数やクラス を書く際にいつでも設計の選択肢に入る • 入門書の1章で紹介される程度には基本的: template <class T> T square(T x) { return x * x; } 2乗を計算する基本な関数。テンプレートにして おけば、intでもdoubleでも、*演算子を持つあら ゆるクラスで使用できる
23.
Chapter 03 テンプレート技法
Template Techniques
24.
テンプレート技法について • 限られたルールの中で限界を超えるための必殺技がいくつ
かある • 紹介しきれないので、キーワードと概要の紹介にとどめる • 詳細は、以下の文献を参照: – 『C++テンプレート完全ガイド(David Vandevoode)』 – 『C++テンプレートメタプログラミング(Dave Abrahams』 – 『C++テンプレートテクニック(επιστημη、高橋晶)』 – More C++ Idioms – Boostのソースコード – id:Cryolite, id:DigitalGhost, id:iorateのブログ
25.
テンプレート技法各種 • SFINAE(Substitution Failure
Is Not An Error) – テンプレートの置き換え失敗を、エラーではなくオーバーロードの候 補から外す言語機能。コンパイル時に任意の条件でオーバーロード するのに使用する。「スフィネェ」と発音する。 • テンプレートメタプログラミング – テンプレートの各種機能を駆使して、コンパイル時のC++プログラムに 関するメタ情報を操作する技法 • タグディスパッチ – タグと呼ばれる空クラスを駆使するオーバーロード技法 • 型消去(Type Erasure) – 一時的に型情報を消去してあらゆる型を包含し、元の型に関する情 報を保持しておいて安全に復元して操作する技法
26.
テンプレート技法各種 • 式テンプレート(Expression Template)
– 式をその場では評価せずに式情報をテンプレートに保持しておき、演 算が本当に必要になったときに評価する最適化技法 • CRTP(Curiously Recursive Template Pattern) – 自身の型を基本クラスのテンプレート引数として渡し、基本クラス内で 派生クラスの情報を使用する技法 • ポリシーに基づく設計(Policy-based Design) – 単なる型ではなく、処理をテンプレートとして渡し、コンパイル時に戦 略を切り替える設計手法
27.
Chapter 05
未来 The Future
28.
C++11の次 • C++11では、テンプレート関係で以下の機能が追加された: –
エイリアステンプレート – 可変引数テンプレート – 関数テンプレートのデフォルトテンプレート引数 • 次期バージョンC++1yは、まだ何も決まっていない状態では あるが、考えられている機能をいくつか紹介する
29.
非型テンプレートパラメータの制限緩和 constexprオブジェクトをテンプレートパラメータで受け取れるよ うにしよう、というもの struct C {
constexpr C(int v) : v(v) { } int v; }; template <C c> struct X { int ar[c.v]; }; N3413 - Allowing arbitrary literal types for non-type template parameters http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3413.html
30.
コンパイル時if文 static if宣言/文。テンプレートの特殊化やオーバーロード ではなくif文で分岐する。 template <int
n> struct factorial { static if (n <= 1) { static constexpr value = 1; } else { static constexpr value = factorial<n - 1>::value * n; } }; N3329 Proposal: static if declaration http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3329.pdf
31.
2つしかなかった! • せっかくなので関連情報。 • コンセプトはおそらくC++1yではなくC++22。Clangで実験的に
実装されている。 • ほか、関数の戻り値型の推論強化など: auto f(); // 宣言時点では、戻り値型は不明 auto f() { return 42; } // 戻り値型はint N3386 Return type deduction for normal functions http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3386.html GCC 4.8から-std=c++1yオプションを付けると使用できる
32.
おわりに • テンプレートは、共通コードをまとめるのに使用でき、
重複コードを限りなく減らせます • テンプレートの特殊化やオーバーロード技法を使用すること により、特定の条件で最適化をかけられます • コンパイル時にプログラムを検証することで、実行をより安全 に行えるようにできます • テンプレートは多くの場面で適用できます。特定の型でのみ 振る舞えればいいのか、汎用的なのかを常に考え、設計の 選択肢を広げましょう。
Baixar agora