Movatterモバイル変換


[0]ホーム

URL:


Akihiko Matuura, profile picture
Uploaded byAkihiko Matuura
PDF, PPTX9,520 views

C++ Template Meta Programming の紹介@社内勉強会

Embed presentation

Download as PDF, PPTX
C++Template MetaProgrammingの、さわりだけ...CORE 北海道カンパニー 勉強会2013/7/26 松浦13年7月27日土曜日
C++テンプレートを使ったメタプログラミングについて紹介します!まあ、そんなのもあるんだー、ふーん、くらいな感じで今日は、13年7月27日土曜日
13年7月27日土曜日
メタプログラムとは何か?テンプレートの基礎テンプレート特殊化再帰テンプレートメタ関数型シーケンスさいごに目次13年7月27日土曜日
メタプログラムとは何か?テンプレートの基礎テンプレート特殊化再帰テンプレートメタ関数型シーケンスさいごに13年7月27日土曜日
ロジックを直接コーディングするのではなく、あるパターンをもったロジックを生成する高位ロジックによってプログラミングを行う方法、またその高位ロジックを定義する方法のこと。........wikipedia13年7月27日土曜日
いみが まったくわからないいやん♡13年7月27日土曜日
プログラムを生成するプログラム、ってことでいいと思うぽよ。ようは13年7月27日土曜日
例えばYACCexpression : term| expression ‘+’ term {$$=$1+$2;}| expression ‘-’ term {$$=$1-$2;} ;term : factor| term ‘*’ factor { $$ = $1 * $2; }| term ‘/’ factor { $$ = $1 / $2; } ;factor : INTEGER| group ;group : ‘(’ expression ‘)’ ;13年7月27日土曜日
YACC.y YACC .c13年7月27日土曜日
YACC.y YACC .cドメイン言語(DSL)ホスト言語13年7月27日土曜日
boost.spiritexpr = ( term[expr.val = _1] >> '+' >> expr[expr.val += _1])| ( term[expr.val = _1] >> '-' >> expr[expr.val -= _1])| term[expr.val = _1] ;term = ( factor[term.val = _1] >> '*' >> term[term.val *= _1])| ( factor[term.val = _1] >> '/' >> term[term.val /= _1])| factor[term.val = _1] ;factor = integer[factor.val = _1]| ( '(' >> expr[factor.val- _1] >> ')' ) ;13年7月27日土曜日
boost.spirit.cpp13年7月27日土曜日
boost.spirit.cppドメイン言語 ホスト言語13年7月27日土曜日
boost.spirit.cppドメイン言語 ホスト言語EDSL(埋め込みドメイン言語)13年7月27日土曜日
boost.spirit.cppドメイン言語 ホスト言語EDSL(埋め込みドメイン言語)YACC相当のものは?13年7月27日土曜日
boost.spirit.cppドメイン言語 ホスト言語EDSL(埋め込みドメイン言語)YACC相当のものは?テンプレート・メタプログラミング13年7月27日土曜日
なぜC++でメタプロ?別の構文規則を学ぶ必要がない他のメタプロとの相互運用余分な構築ステップ不要品質、再利用、可搬性13年7月27日土曜日
とはいえboost.spiritのような究極のメタプログラミングの話は割愛します。このあとの章では、C++メタプロを支える基本的な部分だけお話します。(ちゃんと話せる自信がないというのはナイショぽよ13年7月27日土曜日
メタプログラムとは何か?テンプレートの基礎テンプレート特殊化再帰テンプレートメタ関数型シーケンスさいごに13年7月27日土曜日
普通のジェネリック// C#List<string> list = new List<string>();list.add("hoge"); list.add("page");// JavaList<String> list = new ArrayList<String>();list.add("hoge"); list.add("page");//C++list<string> list;list.insert("hoge"); list.insert("page");13年7月27日土曜日
非型テンプレート//C++template<int N>struct pow {static const int value = N*N;};int n = pow<3>::value; // n = 3*3;13年7月27日土曜日
型の操作ポインタを追加する//C++template<class T>struct add_pointer {typedef T* type;};int n = 10;// int* p = &n;add_pointer<int>::type p = &n;13年7月27日土曜日
C++テンプレートコンパイル時に計算してしまう(実行時コスト0)。非型テンプレート型操作.....などなど13年7月27日土曜日
メタプログラムとは何か?テンプレートの基礎テンプレート特殊化再帰テンプレートメタ関数型シーケンスさいごに13年7月27日土曜日
add_pointerの例ん??// int* p = &n;add_pointer<int>::type p1 = &n;// これはエラー:int** p2 = &n;add_pointer<int*>::type p2 = &n;13年7月27日土曜日
そこで特殊化template<class T>struct add_pointer {typedef T* type;};// そもそもポインタだったらこっちtemplate<class T>struct add_pointer<T*> {typedef T* type;};int n = 10;// int* p = &n;add_pointer<int>::type p1 = &n;// めでたしadd_pointer<int*>::type p2 = &n;13年7月27日土曜日
テンプレート特殊化テンプレート特殊化により、コンパイル時に条件分岐を行うことができる。13年7月27日土曜日
コンパイル時 if文template<bool b, class T1, class T2>struct If_;template<class T1, class T2>struct If_<true,T1,T2> {typedef T1 type; // 条件が真ならT1を使用する};template<class T1, class T2>struct If_<false,T1,T2> {typedef T2 type; // 条件が偽ならT2を使用する};If_<sizeof(long) > sizeof(char), char, long>::type x; // char x;13年7月27日土曜日
コンパイル時assert// 宣言だけtemplate<bool b>struct Static_assert;// true版のみ定義しfalse版は定義しないtemplate<>struct Static_assert<true>{};#define STATIC_ASSERT(b) { sizeof( Static_assert<b> ); }void foo() {STATIC_ASSERT(sizeof(long) == 4);char dest[32];char src[16];STATIC_ASSERT(sizeof(dest) >= sizeof(src));::memcpy(dest,src,sizeof(src));}13年7月27日土曜日
C++テンプレートコンパイル時に計算してしまう(実行時コスト0)。非型テンプレート型操作特殊化による条件分岐13年7月27日土曜日
メタプログラムとは何か?テンプレートの基礎テンプレート特殊化再帰テンプレートメタ関数型シーケンスさいごに13年7月27日土曜日
普通に再帰で階乗計算int factorial(int N) {return N==0 ? 1 : N*factorial(N-1);}int n = factorial(3); // 613年7月27日土曜日
再帰テンプレートで// 階乗を求めるtemplate <int N>struct factorial_t {static const int value = N*factorial_t<N-1>::value;};// N==0の場合は特殊化するtemplate <>struct factorial_t<0> {static const int value = 1;};int n2 = factorial_t<3>::value; // n2 = 6;13年7月27日土曜日
再帰テンプレート再帰テンプレートにより、コンパイル時に繰り返し処理を行うことができる。13年7月27日土曜日
余談C++テンプレートはチューリング完全である(制限:再帰に限界あり)C++ Templates are Turing Completehttp://ubietylab.net/ubigraph/content/Papers/pdf/CppTuring.pdf13年7月27日土曜日
C++テンプレートコンパイル時に計算してしまう(実行時コスト0)。非型テンプレート型操作特殊化による条件分岐再帰テンプレートによる繰り返し13年7月27日土曜日
このへんからちょっとだけ応用な感じです。ちょっとだけよ♡13年7月27日土曜日
メタプログラムとは何か?テンプレートの基礎テンプレート特殊化再帰テンプレートメタ関数型シーケンスさいごに13年7月27日土曜日
メタ関数とはadd_pointer<int>::type pi;関数名int v = factorial_t<3>::value;パラメータ 戻り値(型)関数名 パラメータ 戻り値(値)13年7月27日土曜日
高階関数を考えてみようまずは普通のテンプレート関数f(f(x)) の結果を返すtwicetemplate<class F, class X>struct twice {static int value(const X& x ){return F::apply(F::apply(x));}};struct div2 {static int apply(int x) { return x/2; }};std::cout << twice<div2,int>::value(8); // 213年7月27日土曜日
高階メタ関数template<class F, int N>struct twice {static const int value =F::template apply<F::template apply<N>::value>::value;};struct div2 {template<int N>struct apply {static const int value = N/2;};};std::cout << twice<div2,8>::value; // 213年7月27日土曜日
メタプログラムとは何か?テンプレートの基礎テンプレート特殊化再帰テンプレートメタ関数型シーケンスさいごに13年7月27日土曜日
こんなことしたいそれぞれの型のインスタンスを用意してメソッドを呼び出したい。struct A { std::string name() const { return "A!"; } };struct B { std::string name() const { return "B!"; } };struct C { std::string name() const { return "C!"; } };struct D { std::string name() const { return "D!"; } };/* こんなことしたいA a; a.name(); B b; b.name();C c; c.name(); D d; d.name();とかfor( v : [A,B,C,D] ) print( v.name() ); // 擬似コードです*/13年7月27日土曜日
JavaやC#、ObjCあたりのアプローチリフレクションを使う。Classクラスのようなメタクラスの配列を使って動的生成する、とかね。C++のリフレクションは貧弱。どうしよう。13年7月27日土曜日
C++のアプローチメタプログラミングで型のリスト(型シーケンス)を用意し、各型にアクセスする仕掛けを考えてみる。TypeList<A,B,C,D>::type;13年7月27日土曜日
C++のアプローチメタプログラミングで型のリスト(型シーケンス)を用意し、各型にアクセスする仕掛けを考えてみる。TypeList<A,B,C,D>::type;このへんをどうするか??13年7月27日土曜日
型シーケンスtemplate<class First, class Rest>struct Cons {typedef First first;typedef Rest rest;};struct ConsNil {};// 型シーケンス TypeList<T1,T2,T3,T4>template<class T1, class T2, class T3, class T4>struct TypeList {typedef Cons<T1,Cons<T2,Cons<T3,Cons<T4,ConsNil> > > > type;};13年7月27日土曜日
型シーケンスtemplate<class First, class Rest>struct Cons {typedef First first;typedef Rest rest;};struct ConsNil {};// 型シーケンス TypeList<T1,T2,T3,T4>template<class T1, class T2, class T3, class T4>struct TypeList {typedef Cons<T1,Cons<T2,Cons<T3,Cons<T4,ConsNil> > > > type;};このへんがキモ13年7月27日土曜日
むずくないよtemplate<class First, class Rest>struct Cons {typedef First first;typedef Rest rest;};struct ConsNil {};template<class T1, class T2, class T3, class T4>struct TypeList {typedef Cons<T1,Cons<T2,Cons<T3,Cons<T4,ConsNil> > > > type;};// typedef First first; : T1// typedef Rest rest; : Cons<T2,Cons<T3,Cons<T4,ConsNil> > >// typedef First first; : T2// typedef Rest rest; : Cons<T3,Cons<T4,ConsNil> >// typedef First first; : T3// typedef Rest rest; : Cons<T4,ConsNil>// typedef First first; : T4// typedef Rest rest; : ConsNil ← ターミネータ13年7月27日土曜日
あとは繰り返す処理// typedef First first; : T1// typedef Rest rest; : Cons<T2,Cons<T3,Cons<T4,ConsNil> > >// typedef First first; : T2// typedef Rest rest; : Cons<T3,Cons<T4,ConsNil> >// typedef First first; : T3// typedef Rest rest; : Cons<T4,ConsNil>// typedef First first; : T4// typedef Rest rest; : ConsNil ← ターミネータtemplate<class CONS>struct for_each {template<class FUNC>static void apply( const FUNC& f ) {typename CONS::first v;f( v );for_each<typename CONS::rest>::apply(f);}};13年7月27日土曜日
ターミネータ忘れてた!template<class CONS>struct for_each {template<class FUNC>static void apply( const FUNC& f ) {typename CONS::first v;f( v );for_each<typename CONS::rest>::apply(f);}};// ターミネータ用に特殊化template<>struct for_each<ConsNil> {template<class FUNC>static void apply( const FUNC& ){ }};13年7月27日土曜日
使ってみようstruct A { std::string name() const { return "A!"; } };struct B { std::string name() const { return "B!"; } };struct C { std::string name() const { return "C!"; } };struct D { std::string name() const { return "D!"; } };struct Printer {template<class T> void operator()(const T& v) const {std::cout << v.name() << std::endl;}};void foo(){for_each<TypeList<A,B,C,D>::type>::apply( Printer() );}// for( v : [A,B,C,D] ) print( v.name() ); ↑ 似てる// A!// B!// C!// D!13年7月27日土曜日
リフレクションが無くてもテンプレートでいろいろ出来ちゃう。しかも多くをコンパイル時に静的に。boost.mpl には型のためのコンテナ、イテレータ、アルゴリズムがある。遅延評価、ラムダなども。正直、あたまおかしい(笑)13年7月27日土曜日
メタプログラムとは何か?テンプレートの基礎テンプレート特殊化再帰テンプレートメタ関数型シーケンスさいごに13年7月27日土曜日
新たなパラダイムに出会えたね!構造化データ指向オブジェクト指向ジェネリック関数型・・・メタプログラミング13年7月27日土曜日
余談GoFデザインパターンはオブジェクト指向だけか?例えば Abstract FactoryパターンやVisitor パターンは、メタプロと相性が良い。継承でなくポリシとか。メタプロと関数型?どちらも状態を持たない13年7月27日土曜日
まとめC++テンプレート機能により、コンパイル時の処理を書くことが出来る。ライブラリの実装では多用される。でも、正直読みにくいし難解。C++11ではconstexprにより多少ましになっている。13年7月27日土曜日
おつかれさま!もうおわり?♡ふう...13年7月27日土曜日

Recommended

PPTX
最新C++事情 C++14-C++20 (2018年10月)
PDF
闇魔術を触ってみた
PDF
Template Meta Programming入門から応用まで
PDF
ゲーム開発者のための C++11/C++14
PDF
組み込みでこそC++を使う10の理由
PDF
クロージャデザインパターン
PPTX
Map
PPTX
BoostAsioで可読性を求めるのは間違っているだろうか
PDF
C++コミュニティーの中心でC++をDISる
PPTX
C++0x総復習
PDF
中3女子が狂える本当に気持ちのいい constexpr
PDF
Pfi Seminar 2010 1 7
PDF
オブジェクト指向できていますか?
PDF
C++14 Overview
PDF
constexpr idioms
 
PPTX
競技プログラミングのためのC++入門
PDF
C++11概要 ライブラリ編
 
PDF
C++ Template Metaprogramming
PDF
F#入門 ~関数プログラミングとは何か~
PDF
templateとautoの型推論
PPTX
Visual C++で使えるC++11
PDF
プログラムの処方箋~健康なコードと病んだコード
ODP
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
PDF
不遇の標準ライブラリ - valarray
PDF
Emcpp item31
PDF
C++ ポインタ ブートキャンプ
PDF
Emcjp item21
PDF
Unity2015_No10_~UGUI&Audio~
 
PDF
Boostのあるプログラミング生活
PDF
C++の話(本当にあった怖い話)

More Related Content

PPTX
最新C++事情 C++14-C++20 (2018年10月)
PDF
闇魔術を触ってみた
PDF
Template Meta Programming入門から応用まで
PDF
ゲーム開発者のための C++11/C++14
PDF
組み込みでこそC++を使う10の理由
PDF
クロージャデザインパターン
PPTX
Map
PPTX
BoostAsioで可読性を求めるのは間違っているだろうか
最新C++事情 C++14-C++20 (2018年10月)
闇魔術を触ってみた
Template Meta Programming入門から応用まで
ゲーム開発者のための C++11/C++14
組み込みでこそC++を使う10の理由
クロージャデザインパターン
Map
BoostAsioで可読性を求めるのは間違っているだろうか

What's hot

PDF
C++コミュニティーの中心でC++をDISる
PPTX
C++0x総復習
PDF
中3女子が狂える本当に気持ちのいい constexpr
PDF
Pfi Seminar 2010 1 7
PDF
オブジェクト指向できていますか?
PDF
C++14 Overview
PDF
constexpr idioms
 
PPTX
競技プログラミングのためのC++入門
PDF
C++11概要 ライブラリ編
 
PDF
C++ Template Metaprogramming
PDF
F#入門 ~関数プログラミングとは何か~
PDF
templateとautoの型推論
PPTX
Visual C++で使えるC++11
PDF
プログラムの処方箋~健康なコードと病んだコード
ODP
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
PDF
不遇の標準ライブラリ - valarray
PDF
Emcpp item31
PDF
C++ ポインタ ブートキャンプ
PDF
Emcjp item21
PDF
Unity2015_No10_~UGUI&Audio~
 
C++コミュニティーの中心でC++をDISる
C++0x総復習
中3女子が狂える本当に気持ちのいい constexpr
Pfi Seminar 2010 1 7
オブジェクト指向できていますか?
C++14 Overview
constexpr idioms
 
競技プログラミングのためのC++入門
C++11概要 ライブラリ編
 
C++ Template Metaprogramming
F#入門 ~関数プログラミングとは何か~
templateとautoの型推論
Visual C++で使えるC++11
プログラムの処方箋~健康なコードと病んだコード
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
不遇の標準ライブラリ - valarray
Emcpp item31
C++ ポインタ ブートキャンプ
Emcjp item21
Unity2015_No10_~UGUI&Audio~
 

Viewers also liked

PDF
Boostのあるプログラミング生活
PDF
C++の話(本当にあった怖い話)
PDF
C++の黒魔術
PDF
エクストリームC++11/14プログラミング
 
PDF
170614 iclr reading-public
PDF
ICLR2017読み会 Data Noising as Smoothing in Neural Network Language Models @Dena
PDF
[ICLR2017読み会 @ DeNA] ICLR2017紹介
PDF
ICLR読み会 奥村純 20170617
PDF
言葉のもつ広がりを、モデルの学習に活かそう -one-hot to distribution in language modeling-
PPTX
C++ Presentation
PDF
C++入門?
 
PDF
Semi-Supervised Classification with Graph Convolutional Networks @ICLR2017読み会
PPTX
Windows 10 フォローアップ講座
PPTX
Window 10 楽しい使い方
PDF
Q prop
PPTX
医療データ解析界隈から見たICLR2017
Boostのあるプログラミング生活
C++の話(本当にあった怖い話)
C++の黒魔術
エクストリームC++11/14プログラミング
 
170614 iclr reading-public
ICLR2017読み会 Data Noising as Smoothing in Neural Network Language Models @Dena
[ICLR2017読み会 @ DeNA] ICLR2017紹介
ICLR読み会 奥村純 20170617
言葉のもつ広がりを、モデルの学習に活かそう -one-hot to distribution in language modeling-
C++ Presentation
C++入門?
 
Semi-Supervised Classification with Graph Convolutional Networks @ICLR2017読み会
Windows 10 フォローアップ講座
Window 10 楽しい使い方
Q prop
医療データ解析界隈から見たICLR2017

Similar to C++ Template Meta Programming の紹介@社内勉強会

PDF
C++勉強会in広島プレゼン資料
PDF
C++ template-primer
PDF
Boost Tour 1.50.0 All
PDF
テンプレートメタプログラミング as 式
PDF
中3女子でもわかる constexpr
PDF
リテラル文字列型までの道
PDF
Boost Fusion Library
PDF
Constexpr 中3女子テクニック
PDF
Boost Tour 1_58_0 merge
PDF
高位合成におけるC++テンプレートメタプログラミングの効果
PDF
What is template
PPTX
Lambda in template_final
PDF
わんくま同盟大阪勉強会#61
PDF
C++0x 言語の未来を語る
PDF
C++ lecture-0
PDF
boost tour 1.48.0 all
PDF
Metaprogramming
PDF
Tr18015
DOCX
Boost勉強会 #10 ディスカッションまとめ
PDF
Tddbc岡山LT
C++勉強会in広島プレゼン資料
C++ template-primer
Boost Tour 1.50.0 All
テンプレートメタプログラミング as 式
中3女子でもわかる constexpr
リテラル文字列型までの道
Boost Fusion Library
Constexpr 中3女子テクニック
Boost Tour 1_58_0 merge
高位合成におけるC++テンプレートメタプログラミングの効果
What is template
Lambda in template_final
わんくま同盟大阪勉強会#61
C++0x 言語の未来を語る
C++ lecture-0
boost tour 1.48.0 all
Metaprogramming
Tr18015
Boost勉強会 #10 ディスカッションまとめ
Tddbc岡山LT

More from Akihiko Matuura

PDF
マルチコア時代の並列プログラミング
PDF
アーキテクチャパターンの紹介
PDF
Objectie-C de ラムダ
PDF
boost and c++11
PPTX
Go 言語を語ってみるか
KEY
Open Business Model
マルチコア時代の並列プログラミング
アーキテクチャパターンの紹介
Objectie-C de ラムダ
boost and c++11
Go 言語を語ってみるか
Open Business Model

C++ Template Meta Programming の紹介@社内勉強会


[8]ページ先頭

©2009-2025 Movatter.jp