SlideShare a Scribd company logo
Enviar búsqueda
Cargar
Iniciar sesión
Registrarse
C++ Template Metaprogramming
Denunciar
Akira Takahashi
Seguir
Programmer en Preferred Networks, Inc.
27 de Aug de 2011
•
0 recomendaciones
•
5,098 vistas
1
de
11
C++ Template Metaprogramming
27 de Aug de 2011
•
0 recomendaciones
•
5,098 vistas
Descargar ahora
Descargar para leer sin conexión
Denunciar
Akira Takahashi
Seguir
Programmer en Preferred Networks, Inc.
Recomendados
Template Meta Programming入門から応用まで
yoshihikoozaki5
12.2K vistas
•
417 diapositivas
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
9.4K vistas
•
59 diapositivas
君はまだ,本当のプリプロセスを知らない
digitalghost
5.4K vistas
•
33 diapositivas
templateとautoの型推論
MITSUNARI Shigeo
15K vistas
•
22 diapositivas
Effective Modern C++ 勉強会#1 Item3,4
Takashi Hoshino
2.7K vistas
•
24 diapositivas
最新C++事情 C++14-C++20 (2018年10月)
Akihiko Matuura
1.7K vistas
•
39 diapositivas
Más contenido relacionado
La actualidad más candente
What is template
Akira Takahashi
2.9K vistas
•
32 diapositivas
Define and expansion of cpp macro
digitalghost
4.2K vistas
•
48 diapositivas
プログラムの処方箋~健康なコードと病んだコード
Shigenori Sagawa
8.9K vistas
•
59 diapositivas
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
4.7K vistas
•
12 diapositivas
F#によるFunctional Programming入門
bleis tift
3.6K vistas
•
35 diapositivas
現実(えくせる)と戦う話
bleis tift
7.1K vistas
•
42 diapositivas
La actualidad más candente
(20)
What is template
Akira Takahashi
•
2.9K vistas
Define and expansion of cpp macro
digitalghost
•
4.2K vistas
プログラムの処方箋~健康なコードと病んだコード
Shigenori Sagawa
•
8.9K vistas
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
•
4.7K vistas
F#によるFunctional Programming入門
bleis tift
•
3.6K vistas
現実(えくせる)と戦う話
bleis tift
•
7.1K vistas
Replace Output Iterator and Extend Range JP
Akira Takahashi
•
1.6K vistas
C言語講習会2
odenhadengaku
•
2.8K vistas
静的型付け言語Python
kiki utagawa
•
4.6K vistas
ゲーム開発者のための C++11/C++14
Ryo Suzuki
•
102.7K vistas
error handling using expected
Akira Takahashi
•
3K vistas
Python と型アノテーション
K Yamaguchi
•
16.9K vistas
C言語講習会3
odenhadengaku
•
2K vistas
F#入門 ~関数プログラミングとは何か~
Nobuhisa Koizumi
•
3.6K vistas
C++0x総復習
道化師 堂華
•
4.9K vistas
C++ ポインタ ブートキャンプ
Kohsuke Yuasa
•
10.9K vistas
C言語講習会4
odenhadengaku
•
2.2K vistas
競技プログラミングのためのC++入門
natrium11321
•
32.9K vistas
F#で関数型言語に触れてみよう
wof moriguchi
•
8.1K vistas
やさしく知りたいC言語
uru nru
•
44.3K vistas
Destacado
エクストリームC++11/14プログラミング
egtra
2.1K vistas
•
26 diapositivas
すごい constexpr たのしくレイトレ!
Genya Murakami
25.5K vistas
•
206 diapositivas
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
52.1K vistas
•
106 diapositivas
C++0x Variadic Type List
Akira Takahashi
2.7K vistas
•
20 diapositivas
Boostのあるプログラミング生活
Akira Takahashi
3.8K vistas
•
59 diapositivas
boost and c++11
Akihiko Matuura
1.5K vistas
•
51 diapositivas
Destacado
(17)
エクストリームC++11/14プログラミング
egtra
•
2.1K vistas
すごい constexpr たのしくレイトレ!
Genya Murakami
•
25.5K vistas
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
•
52.1K vistas
C++0x Variadic Type List
Akira Takahashi
•
2.7K vistas
Boostのあるプログラミング生活
Akira Takahashi
•
3.8K vistas
boost and c++11
Akihiko Matuura
•
1.5K vistas
中3女子が狂える本当に気持ちのいい constexpr
Genya Murakami
•
30.4K vistas
中3女子でもわかる constexpr
Genya Murakami
•
48.7K vistas
C++1z draft
Akira Takahashi
•
6.6K vistas
Lisp Meet Up #25, 8-bit PIC マイコン用ネイティブコンパイラの作成
masayukitakagi
•
3.7K vistas
More C++11
京大 マイコンクラブ
•
13.9K vistas
Boost.SIMD
Akira Takahashi
•
4.6K vistas
C++でCプリプロセッサを作ったり速くしたりしたお話
Kinuko Yasuda
•
33.3K vistas
C++14 Overview
Akira Takahashi
•
11.8K vistas
C++の黒魔術
Daichi OBINATA
•
6.8K vistas
C++の話(本当にあった怖い話)
Yuki Tamura
•
27.5K vistas
夜寝ていたら突然本番障害だと起こされて異世界に召還されたときに役に立つこと
kouzirou tenkubashi
•
275 vistas
Similar a C++ Template Metaprogramming
C++0x concept
Akira Takahashi
2.1K vistas
•
50 diapositivas
C++0x 言語の未来を語る
Akira Takahashi
1.7K vistas
•
40 diapositivas
Lambda in template_final
Cryolite
4.4K vistas
•
72 diapositivas
ナウなヤングにバカうけのイカしたタグ付き共用体
digitalghost
2.3K vistas
•
24 diapositivas
Pythonと型チェッカー
Tetsuya Morimoto
12.4K vistas
•
72 diapositivas
Python と型ヒント (Type Hints)
Tetsuya Morimoto
38K vistas
•
39 diapositivas
Similar a C++ Template Metaprogramming
(13)
C++0x concept
Akira Takahashi
•
2.1K vistas
C++0x 言語の未来を語る
Akira Takahashi
•
1.7K vistas
Lambda in template_final
Cryolite
•
4.4K vistas
ナウなヤングにバカうけのイカしたタグ付き共用体
digitalghost
•
2.3K vistas
Pythonと型チェッカー
Tetsuya Morimoto
•
12.4K vistas
Python と型ヒント (Type Hints)
Tetsuya Morimoto
•
38K vistas
わんくま同盟大阪勉強会#61
TATSUYA HAYAMIZU
•
955 vistas
boost tour 1.48.0 all
Akira Takahashi
•
2.6K vistas
constexpr idioms
fimbul
•
3.2K vistas
Boost tour 1_40_0
Akira Takahashi
•
2.5K vistas
Emcpp item31
mitsutaka_takeda
•
10.4K vistas
Emcjp item21
MITSUNARI Shigeo
•
2.3K vistas
拡張可能でprintfっぽい書式指定ができて書式指定文字列と引数をコンパイル時に検証できる文字列フォーマット関数を作った
digitalghost
•
2.3K vistas
Más de Akira Takahashi
Cpp20 overview language features
Akira Takahashi
890 vistas
•
28 diapositivas
Cppmix 02
Akira Takahashi
674 vistas
•
7 diapositivas
Cppmix 01
Akira Takahashi
999 vistas
•
11 diapositivas
Modern C++ Learning
Akira Takahashi
18.5K vistas
•
12 diapositivas
cpprefjp documentation
Akira Takahashi
1.3K vistas
•
23 diapositivas
Boost tour 1_61_0 merge
Akira Takahashi
2K vistas
•
126 diapositivas
Más de Akira Takahashi
(20)
Cpp20 overview language features
Akira Takahashi
•
890 vistas
Cppmix 02
Akira Takahashi
•
674 vistas
Cppmix 01
Akira Takahashi
•
999 vistas
Modern C++ Learning
Akira Takahashi
•
18.5K vistas
cpprefjp documentation
Akira Takahashi
•
1.3K vistas
Boost tour 1_61_0 merge
Akira Takahashi
•
2K vistas
Boost tour 1_61_0
Akira Takahashi
•
1.4K vistas
Boost tour 1.60.0 merge
Akira Takahashi
•
5.1K vistas
Boost tour 1.60.0
Akira Takahashi
•
2.1K vistas
Boost container feature
Akira Takahashi
•
3.4K vistas
Boost Tour 1_58_0 merge
Akira Takahashi
•
4.8K vistas
Boost Tour 1_58_0
Akira Takahashi
•
2.5K vistas
C++14 solve explicit_default_constructor
Akira Takahashi
•
7.3K vistas
C++14 enum hash
Akira Takahashi
•
8.1K vistas
Multi paradigm design
Akira Takahashi
•
3.2K vistas
Start Concurrent
Akira Takahashi
•
22.8K vistas
Programmer mind
Akira Takahashi
•
10K vistas
Boost.Study 14 Opening
Akira Takahashi
•
4.1K vistas
Executors and schedulers
Akira Takahashi
•
7.4K vistas
Improvement future api
Akira Takahashi
•
7.9K vistas
C++ Template Metaprogramming
1.
C++ テンプレートメタプログラミング
高橋晶(アキラ) ブログ:「Faith and Brave – C++で遊ぼう」 http://d.hatena.ne.jp/faith_and_brave/
2.
はじめに Q.テンプレートメタプログラミングってなんぞ? A.テンプレートのインスタンス化を利用して コンパイル時に評価されるプログラムを書こうぜ!
っていうパラダイム
3.
メタ関数 • コンパイル時に評価される関数 template
<class T> // Tがパラメータ struct identity { typedef T type; // typeが戻り値 }; identity<int>::type i; // int i; テンプレートパラメータを関数のパラメータ、 入れ子型(nested-type)や クラス内定数(static const T)を関数の戻り値を見なす。
4.
特殊化で型特性の判別と条件分岐 テンプレートの特殊化を使って、 型がどんな特性を持ってるのかを判別する 以下はTがvoidかどうかを判別するメタ関数 template <class
T> struct is_void { // void以外だったらfalseを返す static const bool value = false; }; template <> struct is_void<void> { // voidだったらtrueを返す static const bool value = true; }; bool a = is_void<int>::value; // bool a = false; bool b = is_void<void>::value; // bool b = true;
5.
部分特殊化で型特性の判別 • 部分特殊化使った場合。
パターンマッチみたいなもん。 template <class T> struct is_pointer { // ポインタ以外はfalseを返す static const bool value = false; }; template <class T> struct is_pointer<T*> { // ポインタならtrueを返す static const bool value = true; }; bool a = is_pointer<int>::value; // bool a = false; bool b = is_pointer<int*>::value; // bool b = true;
6.
型を修飾する • Tを受け取ってT*を返すメタ関数 template
<class T> struct add_pointer { typedef T* type; }; add_pointer<int>::type p; // int* p; add_pointer<add_pointer<int>::type>::type pp; // int** pp;
7.
再帰テンプレート • メタ関数がメタ関数自身を呼ぶことによって
再帰によるループを表現する template <class T, int N> struct add_pointer { typedef typename add_pointer<T*, N-1>::type type; }; template <class T> struct add_pointer<T, 0> { // 再帰の終了条件 typedef T type; }; add_pointer<int, 5> p; // int***** p;
8.
応用例1 : コンパイル時if文(型の選択)
テンプレートパラメータで条件式をbool値で受け取って パラメータがtrueの場合の型、falseの場合の型を選択する template <bool Cond, class Then, class Else> struct if_c; template <class Then, class Else> struct if_c<true, Then, Else> { typedef Then type; }; template <class Then, class Else> struct if_c<false, Then, Else> { typedef Else type; }; if_c<true, int, char>::type → int if_c<false, int, char>::type → char
9.
応用例2 :
コンテナ/配列からイテレータ/ポインタの型を取り出す template <class Range> struct range_iterator { // 配列以外だったらRange::iterator型を返す typedef typename Range::iterator type; }; template <class T, int N> struct range_iterator<T[N]> { // 配列だったらT*型を返す typedef T* type; }; template <class Range> void foo(Range& r) { typedef typename range_iterator<Range>::type Iterator; } vector<int> v; int ar[3]; foo(v); // Iteratorの型はvector<int>::iteratorになる foo(ar); // Iteratorの型はint*になる
10.
応用例3:
型のシグニチャから部分的に型を抜き出す template <class Signature> struct argument_of; template <class R, class Arg> struct argument_of<R(Arg)> { // 型がR(Arg)の形になってたら typedef R result_type; // 戻り値の型を取り出す typedef Arg argument_type; // 引数の型を取り出す }; typedef argument_of<int(double)>::result_type result; // int typedef argument_of<int(double)>::argument_type argument; // double boost::result_ofで関数オブジェクトの戻り値の型を取得するときに使える
11.
チューリング完全 特殊化によって条件分岐を表現し、 再帰テンプレートによってループを表現できる これらのことから、C++テンプレートは ほぼ(※)チューリング完全だと言われてるみたい。 つまり、コンパイル時に全てのアルゴリズムを解くことができる。 ※再帰的に入れ子にされたテンプレートの インスタンス化は17回までは保証されてる。 『C++ Templates
are Turing Complete』 http://ubiety.uwaterloo.ca/~tveldhui/papers/2003/turing.pdf