Enviar búsqueda
Cargar
C++勉強会in広島プレゼン資料
•
6 recomendaciones
•
6,716 vistas
真一 北原
Seguir
C++勉強会in広島の発表スライドです
Leer menos
Leer más
Tecnología
Denunciar
Compartir
Denunciar
Compartir
1 de 67
Descargar ahora
Descargar para leer sin conexión
Recomendados
Template Meta Programming入門から応用まで
Template Meta Programming入門から応用まで
yoshihikoozaki5
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコード
Shigenori Sagawa
闇魔術を触ってみた
闇魔術を触ってみた
Satoshi Sato
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
digitalghost
リテラル文字列型までの道
リテラル文字列型までの道
Satoshi Sato
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
Constexprとtemplateでコンパイル時にfizz buzz
Constexprとtemplateでコンパイル時にfizz buzz
京大 マイコンクラブ
Recomendados
Template Meta Programming入門から応用まで
Template Meta Programming入門から応用まで
yoshihikoozaki5
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコード
Shigenori Sagawa
闇魔術を触ってみた
闇魔術を触ってみた
Satoshi Sato
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
digitalghost
リテラル文字列型までの道
リテラル文字列型までの道
Satoshi Sato
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
Constexprとtemplateでコンパイル時にfizz buzz
Constexprとtemplateでコンパイル時にfizz buzz
京大 マイコンクラブ
静的型付け言語Python
静的型付け言語Python
kiki utagawa
2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk
mitamex4u
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
Akihiko Matuura
Pythonと型チェッカー
Pythonと型チェッカー
Tetsuya Morimoto
Define and expansion of cpp macro
Define and expansion of cpp macro
digitalghost
Python と型アノテーション
Python と型アノテーション
K Yamaguchi
Start!! Ruby
Start!! Ruby
mitim
クロージャデザインパターン
クロージャデザインパターン
Moriharu Ohzu
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
CHY72
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
Kohsuke Yuasa
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
Ryosuke839
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
natrium11321
Python と型ヒント (Type Hints)
Python と型ヒント (Type Hints)
Tetsuya Morimoto
C++の黒魔術
C++の黒魔術
Daichi OBINATA
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
kiki utagawa
Mesh tensorflow
Mesh tensorflow
kuroko
constexpr idioms
constexpr idioms
fimbul
TensorFlow Operation 作ってみた
TensorFlow Operation 作ってみた
Takuya Sakamoto
C++0x総復習
C++0x総復習
道化師 堂華
C++14言語編
C++14言語編
Mitsuru Kariya
Database.persistentの話
Database.persistentの話
真一 北原
Unlock the Keys to True Leadership
Unlock the Keys to True Leadership
Michael Mamas
Más contenido relacionado
La actualidad más candente
静的型付け言語Python
静的型付け言語Python
kiki utagawa
2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk
mitamex4u
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
Akihiko Matuura
Pythonと型チェッカー
Pythonと型チェッカー
Tetsuya Morimoto
Define and expansion of cpp macro
Define and expansion of cpp macro
digitalghost
Python と型アノテーション
Python と型アノテーション
K Yamaguchi
Start!! Ruby
Start!! Ruby
mitim
クロージャデザインパターン
クロージャデザインパターン
Moriharu Ohzu
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
CHY72
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
Kohsuke Yuasa
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
Ryosuke839
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
natrium11321
Python と型ヒント (Type Hints)
Python と型ヒント (Type Hints)
Tetsuya Morimoto
C++の黒魔術
C++の黒魔術
Daichi OBINATA
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
kiki utagawa
Mesh tensorflow
Mesh tensorflow
kuroko
constexpr idioms
constexpr idioms
fimbul
TensorFlow Operation 作ってみた
TensorFlow Operation 作ってみた
Takuya Sakamoto
C++0x総復習
C++0x総復習
道化師 堂華
C++14言語編
C++14言語編
Mitsuru Kariya
La actualidad más candente
(20)
静的型付け言語Python
静的型付け言語Python
2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
Pythonと型チェッカー
Pythonと型チェッカー
Define and expansion of cpp macro
Define and expansion of cpp macro
Python と型アノテーション
Python と型アノテーション
Start!! Ruby
Start!! Ruby
クロージャデザインパターン
クロージャデザインパターン
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
Python と型ヒント (Type Hints)
Python と型ヒント (Type Hints)
C++の黒魔術
C++の黒魔術
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Mesh tensorflow
Mesh tensorflow
constexpr idioms
constexpr idioms
TensorFlow Operation 作ってみた
TensorFlow Operation 作ってみた
C++0x総復習
C++0x総復習
C++14言語編
C++14言語編
Destacado
Database.persistentの話
Database.persistentの話
真一 北原
Unlock the Keys to True Leadership
Unlock the Keys to True Leadership
Michael Mamas
Sound Different: Tips on differentiating with better writing to build your value
Sound Different: Tips on differentiating with better writing to build your value
Bruce Rowe
THE CROWN MR JAMES
THE CROWN MR JAMES
Jose Manuel Godoy Labarca
Tues. March 21st Pine River Announcements
Tues. March 21st Pine River Announcements
Pine River
ライブラリでよくある動きをUIKitのみでDIYしてみる(Part1)
ライブラリでよくある動きをUIKitのみでDIYしてみる(Part1)
Fumiya Sakai
The Resilient Organization: Adapting to Change in a Challenging World
The Resilient Organization: Adapting to Change in a Challenging World
Olivier Serrat
Pixel landscapes: l'immagine urbana come collage
Pixel landscapes: l'immagine urbana come collage
Davide Tommaso Ferrando
How did we get to Containers: A brief History of Computing
How did we get to Containers: A brief History of Computing
Simone Morellato
Fuerzas del mercado
Fuerzas del mercado
MarioMaldonado917
Manure
Manure
Mohammed Haque
R. Villano - Meridiani: Etica - libro 3^ ed. (parte 3)
R. Villano - Meridiani: Etica - libro 3^ ed. (parte 3)
Raimondo Villano
SureChEMBL patent annotations in Open PHACTS
SureChEMBL patent annotations in Open PHACTS
George Papadatos
I.G. numérique et agriculture
I.G. numérique et agriculture
Isabelle Goudchaux
March 21 letter from Waste Management to City of Ottawa
March 21 letter from Waste Management to City of Ottawa
StittsvilleCentral.ca
Geoeconomic atlas of world energy. A vision of the future to 2030
Geoeconomic atlas of world energy. A vision of the future to 2030
Фонд "Центр стратегических разработок "Северо-Запад"
Innovation in Telecom & Smart City Project Management
Innovation in Telecom & Smart City Project Management
Giuseppe Incitti
Relatório técnico Iluminação Oficina Central
Relatório técnico Iluminação Oficina Central
Alexandre Grossi
Press kit - South Europe Atlantic high-speed rail line
Press kit - South Europe Atlantic high-speed rail line
LISEA
Destacado
(19)
Database.persistentの話
Database.persistentの話
Unlock the Keys to True Leadership
Unlock the Keys to True Leadership
Sound Different: Tips on differentiating with better writing to build your value
Sound Different: Tips on differentiating with better writing to build your value
THE CROWN MR JAMES
THE CROWN MR JAMES
Tues. March 21st Pine River Announcements
Tues. March 21st Pine River Announcements
ライブラリでよくある動きをUIKitのみでDIYしてみる(Part1)
ライブラリでよくある動きをUIKitのみでDIYしてみる(Part1)
The Resilient Organization: Adapting to Change in a Challenging World
The Resilient Organization: Adapting to Change in a Challenging World
Pixel landscapes: l'immagine urbana come collage
Pixel landscapes: l'immagine urbana come collage
How did we get to Containers: A brief History of Computing
How did we get to Containers: A brief History of Computing
Fuerzas del mercado
Fuerzas del mercado
Manure
Manure
R. Villano - Meridiani: Etica - libro 3^ ed. (parte 3)
R. Villano - Meridiani: Etica - libro 3^ ed. (parte 3)
SureChEMBL patent annotations in Open PHACTS
SureChEMBL patent annotations in Open PHACTS
I.G. numérique et agriculture
I.G. numérique et agriculture
March 21 letter from Waste Management to City of Ottawa
March 21 letter from Waste Management to City of Ottawa
Geoeconomic atlas of world energy. A vision of the future to 2030
Geoeconomic atlas of world energy. A vision of the future to 2030
Innovation in Telecom & Smart City Project Management
Innovation in Telecom & Smart City Project Management
Relatório técnico Iluminação Oficina Central
Relatório técnico Iluminação Oficina Central
Press kit - South Europe Atlantic high-speed rail line
Press kit - South Europe Atlantic high-speed rail line
Similar a C++勉強会in広島プレゼン資料
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
Hibiki Yamashiro
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
Hideyuki Tanaka
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
道化師 堂華
Write good parser in perl
Write good parser in perl
Jiro Nishiguchi
MTDDC Hokkaido : テンプレートタグでBrainf*ckを作ってみた
MTDDC Hokkaido : テンプレートタグでBrainf*ckを作ってみた
Katsuhiro Endo
C++ template-primer
C++ template-primer
Kohsuke Yuasa
エンジニア知識共有会発表資料 20090910
エンジニア知識共有会発表資料 20090910
ngi group.
Tremaとtrema edgeの違い
Tremaとtrema edgeの違い
hiroshi oshiba
中3女子でもわかる constexpr
中3女子でもわかる constexpr
Genya Murakami
CMSI計算科学技術特論C (2015) OpenMX とDFT②
CMSI計算科学技術特論C (2015) OpenMX とDFT②
Computational Materials Science Initiative
DTrace for biginners part(2)
DTrace for biginners part(2)
Shoji Haraguchi
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
LINE Corporation
テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式
digitalghost
第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章
Tomonobu_Hirano
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案
yushin_hirano
秀スクリプトの話
秀スクリプトの話
Hiroshi Tokumaru
Sml#探検隊
Sml#探検隊
Hiroki Mizuno
Processing
Processing
Akifumi Nambu
Tokyor23 doradora09
Tokyor23 doradora09
Nobuaki Oshiro
Similar a C++勉強会in広島プレゼン資料
(20)
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
Write good parser in perl
Write good parser in perl
MTDDC Hokkaido : テンプレートタグでBrainf*ckを作ってみた
MTDDC Hokkaido : テンプレートタグでBrainf*ckを作ってみた
C++ template-primer
C++ template-primer
エンジニア知識共有会発表資料 20090910
エンジニア知識共有会発表資料 20090910
Tremaとtrema edgeの違い
Tremaとtrema edgeの違い
中3女子でもわかる constexpr
中3女子でもわかる constexpr
CMSI計算科学技術特論C (2015) OpenMX とDFT②
CMSI計算科学技術特論C (2015) OpenMX とDFT②
DTrace for biginners part(2)
DTrace for biginners part(2)
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式
第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案
秀スクリプトの話
秀スクリプトの話
Sml#探検隊
Sml#探検隊
Processing
Processing
Tokyor23 doradora09
Tokyor23 doradora09
Más de 真一 北原
能年玲奈ちゃん駆動開発
能年玲奈ちゃん駆動開発
真一 北原
型! 型!
型! 型!
真一 北原
型!
型!
真一 北原
templateを依存型っぽく使ってみる
templateを依存型っぽく使ってみる
真一 北原
すごいMonad入門
すごいMonad入門
真一 北原
すごいCoq入門
すごいCoq入門
真一 北原
Lt駆動開発03 コンパイル時fizz buzzやってみた
Lt駆動開発03 コンパイル時fizz buzzやってみた
真一 北原
Lt駆動開発03 サイト運営してみた結果
Lt駆動開発03 サイト運営してみた結果
真一 北原
型安全Printf作ってみた
型安全Printf作ってみた
真一 北原
能年玲奈ちゃんのファンとして本気を出してみた
能年玲奈ちゃんのファンとして本気を出してみた
真一 北原
第2回 mix c++勉強会@tokyo 資料
第2回 mix c++勉強会@tokyo 資料
真一 北原
Más de 真一 北原
(11)
能年玲奈ちゃん駆動開発
能年玲奈ちゃん駆動開発
型! 型!
型! 型!
型!
型!
templateを依存型っぽく使ってみる
templateを依存型っぽく使ってみる
すごいMonad入門
すごいMonad入門
すごいCoq入門
すごいCoq入門
Lt駆動開発03 コンパイル時fizz buzzやってみた
Lt駆動開発03 コンパイル時fizz buzzやってみた
Lt駆動開発03 サイト運営してみた結果
Lt駆動開発03 サイト運営してみた結果
型安全Printf作ってみた
型安全Printf作ってみた
能年玲奈ちゃんのファンとして本気を出してみた
能年玲奈ちゃんのファンとして本気を出してみた
第2回 mix c++勉強会@tokyo 資料
第2回 mix c++勉強会@tokyo 資料
Último
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
Toru Tamaki
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
Toru Tamaki
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
CRI Japan, Inc.
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
atsushi061452
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
CRI Japan, Inc.
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
sn679259
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
WSO2
Último
(10)
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
C++勉強会in広島プレゼン資料
1.
TMPライブラリの設計と実装 C++勉強会in広島 @PG_nonen 2014/01/11
2.
概要 ● ● ● ● ● 自己紹介 はじめに Template Meta Programming(TMP)とは TMPライブラリの設計と実装 質疑応答
3.
自己紹介 ● 名前:北原真一 ○ HNは南山まさかず ○
顔本は本名、その他はHN ● 棲息地 ○ 広島は魔界 ● その他 ○ 平凡な大学生 ○ C++、Haskell、女優の能年玲奈さんなどに興味・関心 があります
4.
自己紹介 ● Twitter ○ @PG_nonen ●
Github ○ minamiyama1994 ● 公開しているライブラリ ○ FTMP ○ parser_combinator
5.
はじめに ● 本日は ○ ○ ○ ○ 「C++」って名前は知ってる C++怖い Template怖い C++わかる ● ……等様々な人に来て頂いています
6.
はじめに ● 初心者の人 ○ 「こんな世界もあるんだな~」ぐらいの気軽な気持ちでど うぞ ●
ガチ勢の人 ○ お手柔らかにお願いします
7.
Templateとは ● N3337 ○ 14 ○
A template defines a family of classes or functions or an alias for a family of types.
8.
Templateとは ● コンパイル時に型や値を引数として渡す機能 ● クラス、関数、型エイリアスなどに指定できる ●
以下の様な構文 template < Template仮引数リスト > 宣言
9.
Template仮引数に指定できるもの ● 型 ● 非型 ●
テンプレート
10.
Template仮引数に指定できるもの ● 型 ○ ○ ○ ○ 型が指定できます 以上 以下の様な構文 typenameとclassで意味は変わらない template <
typename Template仮引数名 > 宣言 template < class Template仮引数名 > 宣言
11.
Template仮引数に指定できるもの ● 非型 ○ N3337の14.1.4に記載されている ■ ■ ■ ■ ■ ■ ■ ■ 整数定数値 enum オブジェクトポインタ 関数ポインタ オブジェクトへの左辺値参照 関数への左辺値参照 メンバへのポインタ std::nullptr
12.
Template仮引数に指定できるもの ● 非型 ○ 以下の様な構文 template
< 型名 Template仮引数名 > 宣言
13.
Template仮引数に指定できるもの ● テンプレート ○ クラステンプレートを指定できる ○
以下の様な構文 template < template < Template仮引数リスト > class Template仮引数名 > 宣言
14.
TMPとは ● Template Meta
Programmingの略 ● ……の前に、Templateの使い方から
15.
Templateの使い方 template < typename
T > struct Hoge { T value ; };
16.
Templateの使い方 template < typename
T > auto add ( T x1 , T x2 ) -> decltype ( x1 + x2 ) { return x1 + x2 ; }
17.
Templateの使い方 ● 本来はこのように「型によらない一般的な処理 を記述する」ためのもの ● ところが…… ●
Meta Programmingに使える!!!!! ● ……ところでMeta Programmingって?
18.
Meta Programmingとは ● 通常のコーディングの「更に上位」のレベルで行 うプログラミング ●
例 ○ 動的・動的にコードの書き換えを行えるLispのマクロ ○ 動的にクラスの構造などをいじれるRubyやIoなどLL言 語の機能 ○ 静的に構文木などをいじれるTemplate Haskell ○ 静的に型などをいじれるC++のTemplate
19.
Meta Programmingとは ● これらを用いて通常のプログラミングの「ワンラ ンク上」のプログラミングを行う ●
これがMeta Programming ● 今日はC++のTemplateを用いたTemplate Meta Programmingと、そのライブラリについて 話す
20.
C++におけるMeta Programming ● C++のソースコードを書いて実行するまでには いくつかのステップが存在する ○
プリプロセス ○ コンパイル ○ 実行 ● 通常のプログラミングは実行時処理 ● プリプロセス時及びコンパイル時プログラミング は「ワンランク上」のプログラミング
21.
Template Meta Programmingとは ●
Templateはコンパイル時に処理を行う ● Templateを用いてコンパイル時に行える「ワン ランク上」の処理とは? ○ 型及びコンパイル時整数定数などの操作 ○ 「コンパイル時に型やコンパイル時定数を操作する」の がTemplate Meta Programming
22.
Template Meta Programmingの例 #include<ostream> #include<iostream> template
< unsigned N > struct factorial { static constexpr unsigned value = N * factorial < N - 1 >::value ; }; template < > struct factorial < 0 > { static constexpr unsigned value = 1 ; }; auto main ( ) -> int { std::cout << factorial < 10 >::value << std::endl ; }
23.
Template Meta Programmingの例 template
< unsigned N > struct factorial { // 整数Nが指定された時、valueの値はN*factorial < N - 1 >::value // N = 5 : value = 5 * factorial < 4 >::value // N = 4 : value = 4 * factorial < 3 >::value // N = 3 : value = 3 * factorial < 2 >::value // ...以下続く static constexpr unsigned value = N * factorial < N - 1 >::value ; };
24.
Template Meta Programmingの例 template
< > struct factorial < 0 > { // N = 0 の時だけvalue=1に特殊化 static constexpr unsigned value = 1 ; };
25.
Template Meta Programmingの例 auto
main ( ) -> int { // factorialのNに10を指定する // N = 10 の時 // factorial < 10 >::value = 10 * 9 * 8 * … * 1 = 10! // よって画面には 10! = 3628800 が表示される std::cout << factorial < 10 >::value << std::endl ; }
26.
Template Meta Programmingの例 ●
factorialは階乗を求める「メタ関数」 ● 階乗は「コンパイル時に」求められる
27.
Template Meta Programmingの例 #include<utility> #include<string> template
< typename > struct swap ; template < typename T1 , typename T2 > struct swap < std::pair < T1 , T2 > > { using type = std::pair < T2 , T1 > ; }; auto main ( ) -> int { swap < std::pair < int , std::string > >::type pair = std::make_pair ( “Hello” , 1 ) ; }
28.
Template Meta Programmingの例 //
swapは型を1つ受け取るメタ関数 template < typename > struct swap ; template < typename T1 , typename T2 > // std::pair < T1 , T2 >形式の型だけ受け付けるように特殊化 struct swap < std::pair < T1 , T2 > > { // T1とT2を取り替えたstd::pairをメンバtypedefのtypeに指定する using type = std::pair < T2 , T1 > ; };
29.
Template Meta Programmingの例 auto
main ( ) -> int { // swap < std::pair < int , std::string > >::typeはstd::pairの1つ目の型と2つ目の型を入れ替えた 新しいstd::pair // 1つ目の型 -> int // 2つ目の型 -> std::string // 従って、swap < std::pair < int , std::string > >::typeはstd::pair < std::string , int > // なので以下のコードはコンパイルが通る swap < std::pair < int , std::string > >::type pair = std::make_pair ( “Hello” , 1 ) ; }
30.
Template Meta Programming ●
TMPを行うと、このようにコンパイル時に整数定 数値や型を操作することができる
31.
TMPライブラリの設計と実装 ● ではいよいよ本題の「TMPライブラリの設計と 実装」について
32.
TMPライブラリの設計と実装 ● まず、TMPの際に使われる慣習について ○ メタ関数の「戻り値」としてはtypeメンバが使われる ○
以上 ● 流石に少し解説 ○ メタ関数は単なるtemplateなstruct/class ○ C++の言語仕様として「戻り値」などが設定されているわ けではない ○ そこで、慣習として、typeメンバがよく使われる
33.
TMPライブラリの設計と実装 ● TMPの特徴 ○ 入力(Template仮引数)によって結果(typeメンバ)は決 まる ○
Template仮引数以外に外部からの入力はないし、外部 に影響を与える処理もない ○ つまり、純粋関数型プログラミングとなる
34.
TMPライブラリの設計と実装 ● TMPは純粋関数型プログラミング ● 改めてTMP用のライブラリを設計・実装するな ら既存の関数型言語のライブラリに倣った方が いい ●
……と、その前に ● 既存のライブラリは?
35.
既存のTMPライブラリ ● 既存のTMPライブラリ ○ 事実上デファクトスタンダードとなっているライブラリが存 在する ○
Boost.MPL ○ では、肝心のBoost.MPLはどういった設計になっている のか?
36.
既存のTMPライブラリ ● Boost.MPLの設計 ○ データ構造としての各種コンテナ ○
それらに対して作用する各種アルゴリズム ○ データ構造とアルゴリズムを橋渡しするイテレータ ■ →STLに倣った設計に
37.
既存のTMPライブラリ ● Boost.MPLの設計の問題点 ○ STLの設計に倣っている ○
STLは基本的に手続き型のコードで使われるのが前提 ■ 関数型プログラミングであるTMPとは相性が悪い ○ また、各種コンテナは複雑な内部構造を採用 ○ 論理的な等値比較などが面倒くさい ○ 要するにBoost.MPLは使いにくい
38.
既存のTMPライブラリ ● Boost.MPL以外のメジャーなTMPライブラリは あまりない ● では、作ってしまえ!
39.
TMPライブラリの設計と実装 ● 設計の方針 ○ Haskellなどの純粋関数型言語のライブラリ設計に倣う ○
→List・Set・Mapなどとそれに対する関数群 ○ 論理的な等値比較などは細かい内部構造を意識しなく ても可能なように設計 ○ →Boost.MPLとは異なり、すべての型に対して論理的な 等値比較を提供 ● というわけで完成しました ○ https://github.com/minamiyama1994/FTMP
40.
TMPライブラリの設計と実装 ● FTMPの設計 ○ list,set,dictと言った基礎的なコンテナ ○
ifやeval_ifなどと言ったutilityメタ関数 ○ Haskellのライブラリを参考に作成した、コンテナなどを 引数として受け取るメタ関数
41.
TMPライブラリの設計と実装 ● FTMPの設計 ○ list,set,dictと言った基礎的なコンテナ ○
ifやeval_ifなどと言ったutilityメタ関数 ○ Haskellのライブラリを参考に作成した、コンテナなどを 引数として受け取るメタ関数
42.
各種コンテナ ● 型を操作するための各種コンテナ ○ list ○
set ○ dict
43.
各種コンテナ ● list ○ list
< T1 , T2 , T3 … TN > ○ 順序付き、重複あり ○ 型のリスト
44.
各種コンテナ ● set ○ set
< T1 , T2 , T3 … TN > ○ 順序不定、重複なし ○ 型のセット(集合)
45.
各種コンテナ ● dict ○ dict
< list < K1 , T1 > , list < K2 , T2 > , ... list < KN , TN > > ○ 順序不定、キーの重複なし ○ 型の辞書
46.
utilityメタ関数 ● ifやeval_if等の各種utilityメタ関数 ○ ○ ○ ○ ○ ○ if_ if_c eval_if eval_if_c print lambda
47.
utilityメタ関数 ● if_ ○ if_
< cond , true_case , false_case > ○ cond::type::valueがtrueの場合はtypeはtrue_case ○ cond::type::valueがfalseの場合はtypeはfalse_case
48.
utilityメタ関数 ● if_c ○ if_
< cond , true_case , false_case > ○ condがtrueの場合はtypeはtrue_case ○ condがfalseの場合はtypeはfalse_case
49.
utilityメタ関数 ● eval_if ○ eval_if
< cond , true_case , false_case > ○ cond::type::valueがtrueの場合はtypeはtrue_case:: type ○ cond::type::valueがfalseの場合はtypeはfalse_case:: type
50.
utilityメタ関数 ● eval_if_c ○ eval_if_c
< cond , true_case , false_case > ○ condがtrueの場合はtypeはtrue_case::type ○ condがfalseの場合はtypeはfalse_case::type
51.
utilityメタ関数 ● print ○ ○ ○ ○ ○ print <
T > 引数は任意の型 結果はTと等しい ただし強制的にコンパイルエラーを出す TMP途中でどのような型が生成されているのかを確認 するのに便利
52.
utilityメタ関数 ● lambda ○ 少し複雑でかつ重要な役割を持っているので、少し詳し く説明する ○
構成要素 ■ プレースホルダー ■ lambdaによる引数の適用
53.
lambda ● プレースホルダー ○ 後々ちゃんとした値に置き換える「仮の値」 ○
arg<N>(Nは0以上の整数値)を指定する
54.
lambda ● lambdaによる引数の適用 ○ メタ関数Fがあるとして、lambda
< F < arg1 , arg2 … argN > >を考える ○ arg1,arg2...argNの中にはarg<M>形式のプレースホル ダーがある ○ lambda < F < arg1 , arg2 … argN > >::apply < a0 , a1 … aN >::typeで、arg1,arg2...argNの中のarg<M> はaMに置き換えられ、F < arg1 , arg2 … argN >::type がlambdaの結果として求められる
55.
lambda lambda < F
< double , arg < 2 > , arg < 0 > , long , arg < 1 > > >::apply < char , short , int >:: type lambda < F < double , arg < 2 > , arg < 0 > , long , arg < 1 > > >::apply < char , short , int >:: type lambda < F < double , arg < 2 > , char , long , arg < 1 > > >::apply < char , short , int >::type lambda < F < double , arg < 2 > , char , long , arg < 1 > > >::apply < char , short , int >::type lambda < F < double , arg < 2 > , char , long , short > >::apply < char , short , int >::type lambda < F < double , arg < 2 > , char , long , short > >::apply < char , short , int >::type lambda < F < double , int , char , long , short > >::apply < char , short , int >::type F < double , int , char , long , short >::type
56.
TMPライブラリの設計と実装 ● FTMPの設計 ○ list,set,dictと言った基礎的なコンテナ ○
ifやeval_ifなどと言ったutilityメタ関数 ○ Haskellのライブラリを参考に作成した、コンテナなどを 引数として受け取るメタ関数
57.
コンテナ用の各種メタ関数 ● list用のメタ関数 ● set用のメタ関数 ●
dict用のメタ関数
58.
コンテナ用の各種メタ関数 ● list,set,dict用のメタ関数 ○ HaskellのData.List,Data.Set,Data.Mapライブラリを参 考に ○
MaybeなどのHaskellの複雑な機能を使っている関数は 適当に簡略化 ■ Maybeの場合は例えばNothingに該当する場合は その場でコンパイルを失敗させる
59.
TMPライブラリの実装 ● TMPライブラリを実装する際のポイントについて ○ 再帰深度 ■
処理系定義($14.7.1.15) ■ ただし、規格での推奨がある(Annex B) ● 「Recursively nested template instantiations [1024].」 ■ listに対して線形の再帰深度のアルゴリズムを実装 すると、大きなlistなどに対しては容易に再帰深度制 限にぶつかることが考えられる ● 再帰深度を対数オーダーに制限する
60.
TMPライブラリの実装 ● 再帰深度を対数オーダーに抑える ○ list操作は主にfoldr,foldlを用いて実装される ○
foldr,foldlの再帰深度を対数オーダーに抑えることを考 える
61.
TMPライブラリの実装 ● foldrの素直な実装
62.
TMPライブラリの実装 ● foldrの対数再帰深度な実装
63.
TMPライブラリの実装 ● foldr,foldlの再帰深度を対数オーダーにするこ とにより、多くの処理の再帰深度を対数オー ダーに抑えることができる ○ →要素数の多いlistなどに対しても適用できる
64.
TMPライブラリ ● Boost.MPLと比較して ○ メリット ■
Haskellのライブラリに倣ったことにより、よりスムー ズなTMPが可能に ○ デメリット ■ テストや、機能が充実しておらず、実績がない
65.
TMPライブラリ ● 適用例 ○ 自作パーサコンビネータ ■
https://github. com/minamiyama1994/parser_combinator ■ 構文解析表を出力する元になる各種情報をTMPを 用いて求めている
66.
TMPライブラリ ● 今後の課題 ○ テストを充実させる ○
実装を充実させる ○ ドキュメントを充実させる
67.
ご清聴ありがとうございました 時間があるようなら質疑応答に入ります
Descargar ahora