狠狠撸
Submit Search
constexpr idioms
Jun 28, 2014
10 likes
3,232 views
F
fimbul
ドワンゴC++勉強会 #1 constexpr idioms
Read less
Read more
1 of 43
Download now
Downloaded 25 times
Recommended
中3女子でもわかる constexpr
中3女子でもわかる constexpr
Genya Murakami
?
Boost.勉強会 #7 中3女子でもわかる constexpr
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
Genya Murakami
?
Boost.勉強会 #8 中3女子が狂える本当に気持ちのいい constexpr
Constexpr 中3女子テクニック
Constexpr 中3女子テクニック
Genya Murakami
?
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
Ryosuke839
?
歌舞伎座.tech#8「C++初心者会」 http://kbkz.connpass.com/event/13905/ での @Ryosuke839 の発表スライドです。
c辞苍蝉迟别虫辫谤関数はコンパイル时処理。これはいい。実行时が霞んで见える。肠辫耻の娇声が闻こえてきそうだ
c辞苍蝉迟别虫辫谤関数はコンパイル时処理。これはいい。実行时が霞んで见える。肠辫耻の娇声が闻こえてきそうだ
Genya Murakami
?
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
Genya Murakami
?
Constexprとtemplateでコンパイル時にfizz buzz
Constexprとtemplateでコンパイル時にfizz buzz
京大 マイコンクラブ
?
リテラル文字列型までの道
リテラル文字列型までの道
Satoshi Sato
?
组み込みでこそ颁++を使う10の理由
组み込みでこそ颁++を使う10の理由
kikairoya
?
叠辞辞蝉迟础蝉颈辞で可読性を求めるのは间违っているだろうか
叠辞辞蝉迟础蝉颈辞で可読性を求めるのは间违っているだろうか
Yuki Miyatake
?
Boost.Asio を読みやすくする。
Effective Modern C++ 勉強会#3 Item 15
Effective Modern C++ 勉強会#3 Item 15
Mitsuru Kariya
?
Item 15: Use constexpr whenever possible. 狠狠撸Share でもちゃんと読めるようにちょっとだけ編集しました。
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
?
SEH on mingw32
SEH on mingw32
kikairoya
?
Boost #8 SEH on mingw32
Visual C++で使えるC++11
Visual C++で使えるC++11
nekko1119
?
身内向けですがせっかく作ったので。 土日に深夜のテンションで作ったので抜け漏れ誤字脱字だらけだと思います…
Map
Map
kikairoya
?
颁++コミュニティーの中心で颁++を顿滨厂る
颁++コミュニティーの中心で颁++を顿滨厂る
Hideyuki Tanaka
?
叠辞辞蝉迟.勉强会4にて発表した内容です。丑迟迟辫://补迟苍诲.辞谤驳/别惫别苍迟蝉/11551
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
?
第14回 全ゲ連での講演資料です。 Twitter: @Reputeless
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16
Mitsuru Kariya
?
Item 16: Make const member functions thread safe. 狠狠撸Share でもちゃんと読めるようにちょっとだけ編集しました。
C++ マルチスレット?フ?ロク?ラミンク?
C++ マルチスレット?フ?ロク?ラミンク?
Kohsuke Yuasa
?
Ohotech 特盛 #10 ( http://ohotech.connpass.com/event/7517/ )で発表した資料です。
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
Ransui Iso
?
The Basics
Emcjp item21
Emcjp item21
MITSUNARI Shigeo
?
Effective Modern C++ item21
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35
Keisuke Fukuda
?
発表资料です
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
Preferred Networks
?
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
Ransui Iso
?
Lisp meets Web : A tutorial of Portable AllegroServe and build a tiny BBS application.
Material
Material
_TUNE_
?
2012/5/19 関数型言語勉強会発表資料( ̄ω ̄*) 最後のページ、「終止」ってなってるのは「終始」の間違いですね、??
Emcpp item31
Emcpp item31
mitsutaka_takeda
?
Effective Modern C++勉強会用資料 https://atnd.org/events/67443
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
CHY72
?
并行プログラミングと継続モナド
并行プログラミングと継続モナド
Kousuke Ruichi
?
:)
El text.tokuron a(2019).watanabe190613
El text.tokuron a(2019).watanabe190613
RCCSRENKEI
?
配信講義 計算科学技術特論A (2019) https://www.r-ccs.riken.jp/library/event/tokuronA_2019.html
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
道化師 堂華
?
主に cppll ML でご紹介してきた tips をC++の仕様をより掘り下げた形でまとめ直してみました。 今回はカンマ演算子にフォーカスした内容です。
More Related Content
What's hot
(20)
组み込みでこそ颁++を使う10の理由
组み込みでこそ颁++を使う10の理由
kikairoya
?
叠辞辞蝉迟础蝉颈辞で可読性を求めるのは间违っているだろうか
叠辞辞蝉迟础蝉颈辞で可読性を求めるのは间违っているだろうか
Yuki Miyatake
?
Boost.Asio を読みやすくする。
Effective Modern C++ 勉強会#3 Item 15
Effective Modern C++ 勉強会#3 Item 15
Mitsuru Kariya
?
Item 15: Use constexpr whenever possible. 狠狠撸Share でもちゃんと読めるようにちょっとだけ編集しました。
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
?
SEH on mingw32
SEH on mingw32
kikairoya
?
Boost #8 SEH on mingw32
Visual C++で使えるC++11
Visual C++で使えるC++11
nekko1119
?
身内向けですがせっかく作ったので。 土日に深夜のテンションで作ったので抜け漏れ誤字脱字だらけだと思います…
Map
Map
kikairoya
?
颁++コミュニティーの中心で颁++を顿滨厂る
颁++コミュニティーの中心で颁++を顿滨厂る
Hideyuki Tanaka
?
叠辞辞蝉迟.勉强会4にて発表した内容です。丑迟迟辫://补迟苍诲.辞谤驳/别惫别苍迟蝉/11551
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
?
第14回 全ゲ連での講演資料です。 Twitter: @Reputeless
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16
Mitsuru Kariya
?
Item 16: Make const member functions thread safe. 狠狠撸Share でもちゃんと読めるようにちょっとだけ編集しました。
C++ マルチスレット?フ?ロク?ラミンク?
C++ マルチスレット?フ?ロク?ラミンク?
Kohsuke Yuasa
?
Ohotech 特盛 #10 ( http://ohotech.connpass.com/event/7517/ )で発表した資料です。
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
Ransui Iso
?
The Basics
Emcjp item21
Emcjp item21
MITSUNARI Shigeo
?
Effective Modern C++ item21
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35
Keisuke Fukuda
?
発表资料です
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
Preferred Networks
?
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
Ransui Iso
?
Lisp meets Web : A tutorial of Portable AllegroServe and build a tiny BBS application.
Material
Material
_TUNE_
?
2012/5/19 関数型言語勉強会発表資料( ̄ω ̄*) 最後のページ、「終止」ってなってるのは「終始」の間違いですね、??
Emcpp item31
Emcpp item31
mitsutaka_takeda
?
Effective Modern C++勉強会用資料 https://atnd.org/events/67443
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
CHY72
?
并行プログラミングと継続モナド
并行プログラミングと継続モナド
Kousuke Ruichi
?
:)
组み込みでこそ颁++を使う10の理由
组み込みでこそ颁++を使う10の理由
kikairoya
?
叠辞辞蝉迟础蝉颈辞で可読性を求めるのは间违っているだろうか
叠辞辞蝉迟础蝉颈辞で可読性を求めるのは间违っているだろうか
Yuki Miyatake
?
Effective Modern C++ 勉強会#3 Item 15
Effective Modern C++ 勉強会#3 Item 15
Mitsuru Kariya
?
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
?
SEH on mingw32
SEH on mingw32
kikairoya
?
Visual C++で使えるC++11
Visual C++で使えるC++11
nekko1119
?
Map
Map
kikairoya
?
颁++コミュニティーの中心で颁++を顿滨厂る
颁++コミュニティーの中心で颁++を顿滨厂る
Hideyuki Tanaka
?
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
?
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16
Mitsuru Kariya
?
C++ マルチスレット?フ?ロク?ラミンク?
C++ マルチスレット?フ?ロク?ラミンク?
Kohsuke Yuasa
?
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
Ransui Iso
?
Emcjp item21
Emcjp item21
MITSUNARI Shigeo
?
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35
Keisuke Fukuda
?
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
Preferred Networks
?
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
Ransui Iso
?
Material
Material
_TUNE_
?
Emcpp item31
Emcpp item31
mitsutaka_takeda
?
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
CHY72
?
并行プログラミングと継続モナド
并行プログラミングと継続モナド
Kousuke Ruichi
?
Similar to constexpr idioms
(20)
El text.tokuron a(2019).watanabe190613
El text.tokuron a(2019).watanabe190613
RCCSRENKEI
?
配信講義 計算科学技術特論A (2019) https://www.r-ccs.riken.jp/library/event/tokuronA_2019.html
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
道化師 堂華
?
主に cppll ML でご紹介してきた tips をC++の仕様をより掘り下げた形でまとめ直してみました。 今回はカンマ演算子にフォーカスした内容です。
Effective java 輪読会 第6章 項目32-34
Effective java 輪読会 第6章 項目32-34
Appresso Engineering Team
?
颁++勉强会颈苍広岛プレゼン资料
颁++勉强会颈苍広岛プレゼン资料
真一 北原
?
颁++勉强会颈苍広岛の発表スライドです
颁++によるソート入门
颁++によるソート入门
AimingStudy
?
颁++において、どのようにソートを実装するかを、入门的に解説します。
DTrace for biginners part(2)
DTrace for biginners part(2)
Shoji Haraguchi
?
DTrace for biginners part(2) Japanese lang only
Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編
Etsuji Nakai
?
「ITエンジニアのための機械学習理論入門」で提供しているサンプルコードに含まれるデータ分析ライブラリ(NumPy/pandasなど)を解説した資料です。 下記の書籍のサンプルコードが理解できるようになることが目標です。 - ITエンジニアのための機械学習理論入門(技術評論社) - http://www.amazon.co.jp/dp/4774176982/ 2015/10/25 ver1.0 公開 2015/10/26 ver1.1 微修正 2016/05/25 ver1.4 subplotの順番を修正 2016/11/15 ver2.0 改訂版公開 2016/11/16 ver2.1 改行幅修正 2017/01/10 ver2.2 微修正 2017/01/12 ver2.3 微修正
2015年度先端骋笔骋笔鲍シミュレーション工学特论 第7回 総和计算(础迟辞尘颈肠演算)
2015年度先端骋笔骋笔鲍シミュレーション工学特论 第7回 総和计算(础迟辞尘颈肠演算)
智啓 出川
?
長岡技術科学大学 2015年度先端GPGPUシミュレーション工学特論(全15回,大学院生対象講義) 第7回総和計算(Atomic演算) 2015年度先端GPGPUシミュレーション工学特論 ?第1回 先端シミュレーションおよび産業界におけるGPUの役割 http://www.slideshare.net/ssuserf87701/2015gpgpu1-59180313 ?第1回補足 GROUSEの利用方法 http://www.slideshare.net/ssuserf87701/2015gpgpu1-59180326 ?第2回 GPUによる並列計算の概念とメモリアクセス http://www.slideshare.net/ssuserf87701/2015gpgpu2-59180382 ?第3回 GPUプログラム構造の詳細(threadとwarp) http://www.slideshare.net/ssuserf87701/2015gpgpu3-59180483 ?第4回 GPUのメモリ階層の詳細(共有メモリ) http://www.slideshare.net/ssuserf87701/2015gpgpu4-59180572 ?第5回 GPUのメモリ階層の詳細(様々なメモリの利用) http://www.slideshare.net/ssuserf87701/2015gpgpu5-59180652 ?第6回 プログラムの性能評価指針(Flop/Byte,計算律速,メモリ律速) http://www.slideshare.net/ssuserf87701/2015gpgpu6-59180736 ?第7回 総和計算(Atomic演算) http://www.slideshare.net/ssuserf87701/2015gpgpu7-59180844 ?第8回 偏微分方程式の差分計算(拡散方程式) http://www.slideshare.net/ssuserf87701/2015gpgpu8-59180918 ?第9回 偏微分方程式の差分計算(移流方程式) http://www.slideshare.net/ssuserf87701/2015gpgpu9-59180982 ?第10回 Poisson方程式の求解(線形連立一次方程式) http://www.slideshare.net/ssuserf87701/2015gpgpu10-59181031 ?第11回 数値流体力学への応用(支配方程式,CPUプログラム) http://www.slideshare.net/ssuserf87701/2015gpgpu11-59181134 ?第12回 数値流体力学への応用(GPUへの移植) http://www.slideshare.net/ssuserf87701/2015gpgpu12-59181230 ?第13回 数値流体力学への応用(高度な最適化) http://www.slideshare.net/ssuserf87701/2015gpgpu13-59181316 ?第14回 複数GPUの利用 http://www.slideshare.net/ssuserf87701/2015gpgpu14-59181367 ?第15回 CPUとGPUの協調 http://www.slideshare.net/ssuserf87701/2015gpgpu15-59181450 2015年度GPGPU実践基礎工学 ?第1回 学際的分野における先端シミュレーション技術の歴史 http://www.slideshare.net/ssuserf87701/2015gpgpu1 2015年度GPGPU実践プログラミング ?第1回 GPGPUの歴史と応用例 http://www.slideshare.net/ssuserf87701/2015gpgpu1-59179080 講義には長岡技術科学大学のGPGPUシステム(GROUSE)を利用しています。 開発環境 CPU Intel Xeon X5670 × 32 GPU NVIDIA Tesla M2050(Fermi世代) × 64 CUDA 4.0(諸般の事情によりバージョンアップされていません) PGI Fortran 11.3
Brief introduction of Boost.ICL
Brief introduction of Boost.ICL
yak1ex
?
Not presented anywhere.
[第2版]Python機械学習プログラミング 第14章
[第2版]Python機械学習プログラミング 第14章
Haruki Eguchi
?
社内勉强会で使用した资料です。
Python standard 2022 Spring
Python standard 2022 Spring
anyakichi
?
2022 の Python はこう書け的な。
エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7
Tetsuya Morimoto
?
20180728 halide-study
20180728 halide-study
Fixstars Corporation
?
Halide勉強会 @フィックスターズの資料です
颁丑补颈苍别谤の使い方と自然言语処理への応用
颁丑补颈苍别谤の使い方と自然言语処理への応用
Seiya Tokui
?
第10回 NLP若手の会シンポジウム (YANS) のチュートリアルスライドです。ニューラルネットの(アルゴリズムとしての)おさらいと、Chainer v1.3.0の使い方を紹介しています。
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方
Satoshi Nagayasu
?
ji-5. 繰り返し計算
ji-5. 繰り返し計算
kunihikokaneko1
?
トピックス:繰り返し, for, while, ユークリッドの互除法, 九九の表の表示, ド?モアブルの公式 Java プログラミング入門(スライド資料とプログラム例)(全6回) https://www.kkaneko.jp/pro/ji/index.html 金子邦彦研究室ホームページ https://www.kkaneko.jp/index.html
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
digitalghost
?
Async design with Unity3D
Async design with Unity3D
Kouji Hosoda
?
鲍苍颈迟测で贬罢罢笔通信をするときに割りと困りがちな非同期処理の设计についてロードオブナイツで使っているデザインを公开します。スライド作成は++肠++;の中の人。
机械学习を用いた予测モデル构筑?评価
机械学习を用いた予测モデル构筑?评価
Shintaro Fukushima
?
厂尘濒#探検队
厂尘濒#探検队
Hiroki Mizuno
?
El text.tokuron a(2019).watanabe190613
El text.tokuron a(2019).watanabe190613
RCCSRENKEI
?
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
道化師 堂華
?
Effective java 輪読会 第6章 項目32-34
Effective java 輪読会 第6章 項目32-34
Appresso Engineering Team
?
颁++勉强会颈苍広岛プレゼン资料
颁++勉强会颈苍広岛プレゼン资料
真一 北原
?
颁++によるソート入门
颁++によるソート入门
AimingStudy
?
DTrace for biginners part(2)
DTrace for biginners part(2)
Shoji Haraguchi
?
Python 機械学習プログラミング データ分析ライブラリー解説編
Python 機械学習プログラミング データ分析ライブラリー解説編
Etsuji Nakai
?
2015年度先端骋笔骋笔鲍シミュレーション工学特论 第7回 総和计算(础迟辞尘颈肠演算)
2015年度先端骋笔骋笔鲍シミュレーション工学特论 第7回 総和计算(础迟辞尘颈肠演算)
智啓 出川
?
Brief introduction of Boost.ICL
Brief introduction of Boost.ICL
yak1ex
?
[第2版]Python機械学習プログラミング 第14章
[第2版]Python機械学習プログラミング 第14章
Haruki Eguchi
?
Python standard 2022 Spring
Python standard 2022 Spring
anyakichi
?
エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7
Tetsuya Morimoto
?
20180728 halide-study
20180728 halide-study
Fixstars Corporation
?
颁丑补颈苍别谤の使い方と自然言语処理への応用
颁丑补颈苍别谤の使い方と自然言语処理への応用
Seiya Tokui
?
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方
Satoshi Nagayasu
?
ji-5. 繰り返し計算
ji-5. 繰り返し計算
kunihikokaneko1
?
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
digitalghost
?
Async design with Unity3D
Async design with Unity3D
Kouji Hosoda
?
机械学习を用いた予测モデル构筑?评価
机械学习を用いた予测モデル构筑?评価
Shintaro Fukushima
?
厂尘濒#探検队
厂尘濒#探検队
Hiroki Mizuno
?
constexpr idioms
1.
constexpr idioms ドワンゴC++勉強会 #1 @fimbul11
2.
INTRODUCTION ? 計算量 (処理
/ コンパイル時間の短縮) ? 再帰深度 (扱える要素数に影響) constexpr /TMPにおいて以下の2点に優れた実装を考える
3.
計算量の抑制の重要性は明白 INTRODUCTION
4.
INTRODUCTION 再帰深度 (扱える要素数に影響)とは たとえば単純に総和を再帰で書くとこんな感じ(計算精度は考慮しない) ! template <typename
T, typename Type, typename... Types> constexpr T sum_impl(T&& result, Type&& arg, Types&&... args) { return sum_impl<T>(result + arg, forward<Types>(args)...); }
5.
INTRODUCTION 再帰深度 (扱える要素数に影響)とは 線形再帰による実装だと再帰深度がO(N) 扱う要素数が増えたらどうなる? ! sum<int>(1,2,3,4,5,…,10000); //
1万までの和を求める ? ↓ ! fatal error: recursive template instantiation exceeded maximum depth of 256
6.
INTRODUCTION メタ関数やコンテナも同様の問題を抱えている ! // 典型的なtuple_elementのrecursive case実装例
線形再帰 template<size_t I, typename Head, typename... Tail> struct tuple_element<I, tuple<Head, Tail...>> : tuple_element<I-1, tuple<Tail...>> {}; ! 計算量?再帰深度は共にO(N)、Iが大きくなるとエラー
7.
再帰深度の抑制は重要 INTRODUCTION
8.
計算量?再帰深度の双方を考慮した コンパイル時処理に有用な技法を考える INTRODUCTION
9.
パラメータパック展開を用いた効率的な要素の走査 INDEXTUPLE
10.
例 : N要素の配列の各要素に関数を適用した配列を作りたい make_array(f(arr[0]),
f(arr[1]), ..., f(arr[N-1])); INDEXTUPLE
11.
整数列を保持する型を用意する template<size_t... Indices> struct index_tuple
{}; INDEXTUPLE
12.
メタプログラミングで整数列を作る 0, Nを受け取り0からN-1までの整数列を生成するindex_range // 以下の2つの型は同じ ! index_tuple<0,
1, 2,..., N-1> ! typename index_range<0, N>::type INDEXTUPLE
13.
テンプレートパラメータパックの展開を利用して処理 template <typename T,
size_t... Indices> constexpr auto apply_f(const T& arr, index_tuple<Indices...>&&) { return make_array(f(arr[Indices])...); } ! apply_f(arr, typename index_range<0, N>::type{}); INDEXTUPLE
14.
index_rangeの実装例 計算量?再帰深度はO(N) (?rst >=
lastとなるまで値をStepだけ増やして再帰する実装) template< size_t First, size_t Last, size_t Step, size_t... Indices > struct index_range<First, Last, Step, index_tuple<Indices...>, false> : index_range<First + Step, Last, Step, index_tuple<Indices..., First>> {}; INDEXTUPLE
15.
既に生成した数列を利用し倍々に数列を生成可能 例えばIndicesが[0,1,2,3]であれば以下の2つの型は等しくなる ! index_tuple<Indices..., (Indices +
sizeof...(Indices))...> index_tuple<0,1,2,3,4,5,6,7> ! この原理で実装するとindex_rangeの計算量?再帰深度はO(logN) INDEXTUPLE 参考 : index_tuple イディオムにおける index_range の効率的な実装 http://boleros.hateblo.jp/entry/20120406/1333682532
16.
まとめ INDEXTUPLE ? パック展開を利用しコンテナ走査の再帰深度を抑制 ? 肝となるindex_rangeは計算量?再帰深度O(logN) ?
対象がインデックスアクセス可能な必要あり ? C++14から同様の機能が標準入り(std::integer_sequence)
17.
パラメータパック分割 テンプレートパラメータパックTYPES1をTYPES2とRESTに分割
18.
パラメータパック分割 Types1の分割の前半となる部分列Types2が作れる場合に分割可能
19.
パラメータパック分割 (実用性は無視した) 例 :Types1をTypes2とRestに分割 template<typename...
Types2> // int,int,int struct f { // Restはtemplate argument deductionで取れる template <typename... Rest> // int,int,int,int void operator()(Types2..., Rest...) {} }; ! template <typename... Types1> // int,int,int,int,int,int,int void call_f() { f<int,int,int>()(Types1{}...); } ! call_f<int,int,int,int,int,int,int>(); Types1[int,int,int,int,int,int,int]Types2[int,int,int] Rest[int,int,int,int]
20.
パラメータパック分割 実用的な例 : tuple<Types…>におけるTypes…のN番目の型を取り出したい VoidsをN-1個の[void,
void, …, void]とし、任意のポインタ型がvoid*で受取可能な為 template <typename... Voids> struct tuple_element_impl { template <typename T, typename... Rest> static T eval(Voids*..., T*, Rest...); // never defined }; ! typedef typename decltype( tuple_element_impl<Voids>::eval( static_cast<identity<Types>*>(nullptr)...))::type type; identity<Types>*…をN-1番目までvoid*,void*,…,void*、N番目をT*, 残りをRest…で 処理する、typenameT::type (即ちtypename identity<N番目の型>::type)は欲しかった型 参考 : 対数オーダーでTemplate Parameter Packから要素を取り出す http://?mbul.hateblo.jp/entry/2013/08/28/203833
21.
パラメータパック分割 N-1個のvoidからなるパックはindex tupleを利用して簡単に作れる template <size_t
N, typename T = void> struct dummy_index { typedef T type; }; ! typename dummy_index<Indices>::type... // void, void, ..., void index_rangeの計算量?再帰深度がO(logN)なのでtuple_elementもO(logN)で実装可能
22.
まとめ ? 分割の前半となる部分列が作れる時、パタメータパックを 分割出来る ? N個のT型からなるパラメータパックはindex_tupleを利用し て生成出来る パラメータパック分割
23.
分割統治法 再帰の形が完全二分木型になれば深度は対数オーダーになる
24.
分割統治法 1. 対象がイテレータの場合
25.
分割統治法 // sproutのcountの実装を見てみる return size
== 1 ? (*first == value ? 1 : 0) // 要素数が1になった場合 : sprout::detail::count_impl_ra( // 左側を処理する first, value, size / 2 ) + sprout::detail::count_impl_ra( // 右側を処理する sprout::next(first, size / 2), value, size - size / 2 ); 対象がイテレータの場合は比較的分かりやすい Sproutのalgorithmの多くはイテレータを用いた分割統治的な実装 Copyright (C) 2014 Bolero MURAKAMI
26.
分割統治法 2. 対象がN個の引数の場合
27.
分割統治法 N個の数の総和関数sumを再び考える
28.
分割統治法 template <typename T,
typename... Types> constexpr T sum(const Types&... args) { return detail::sum_impl< std::make_index_sequence<sizeof...(Types) / 2> >::template eval<T>(args...); } ! sum<int>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // 55 パック分割を利用してN個の引数を半々にすればよい(計算精度は考慮しない) sizeof...(Types) / 2 要素の数列を作ってsum_implに渡す
29.
分割統治法 template <std::size_t... Indices> struct
sum_impl<std::index_sequence<Indices...>> { template <typename T, typename... Types> static constexpr T eval( // パック分割による引数の受取 const typename dummy_index<Indices, T>::type&... args1, // T, T, ..., T const Types&... args2) { return sum_impl< // 引数列の左半分を更に半分ずつに分けるように再帰 std::make_index_sequence<sizeof...(Indices) / 2> >::template eval<T>(args1...) + // 結果を足し合わせる(統治) sum_impl< // 引数列の右半分を更に半分ずつに分けるように再帰 std::make_index_sequence<sizeof...(Types) / 2> >::template eval<T>(args2...); } }; パラメータパック分割を用いて引数列を分割しながら再帰
30.
分割統治法 template <> struct sum_impl<std::index_sequence<>>
{ template <typename T> static constexpr T eval(const T& arg) { return arg; } }; 分割を繰り返し要素数が1になった段階(最も再帰が深い段階) ここから統治段階に移り、和を計算する 再帰深度はO(logN)
31.
分割統治法 template <typename... Types> struct
overloaded_function : detail::overloaded_function_impl< typename index_range<0, sizeof...(Types) / 2>::type, typename index_range<sizeof...(Types) / 2, sizeof...(Types)>::type, type_tuple<Types...>> { // 略 同様の技法をクラスに適用し完全二分木型に多重継承したり可能 参考 : overloaded_functionの再帰深度を抑えた(このような継承の仕方が役に立つケース) http://?mbul.hateblo.jp/entry/2014/06/07/033509
32.
まとめ ? 再帰深度の改善が見込める ? 対象がイテレータなら比較的簡単、パックの分割を利用し ても実装可(最初に引数をコンテナに入れてしまうのも手) ?
継承の形のコントロールも可能 分割統治法
33.
型のMAP 型(非型テンプレートパラメータ)をキーとして 型(非型テンプレートパラメータ)を得る
34.
型のMAP 例 : mpl::vectorのようなものを作ってみる
35.
型のMAP Typesと同じ長さの数列をimplに渡す(0~N-1までの一意なインデックス生成) template <typename... Types> struct
type_vector : type_vector_impl<typename index_range<0, sizeof...(Types)>::type, identity<Types>...> {};
36.
型のMAP パラメータパックを展開しながら継承、高さ1のn分木形に多重継承が実現 template <size_t... Indices,
typename... Types> struct type_vector_impl<index_tuple<Indices...>, Types...> : indexed_type<Types, Indices>... 型とインデックスをindexed_type<Types, Indices>のペアとして継承
37.
型のMAP あるDerivedという型が一意なインデックス0,1,…,N-1を持つ ! Base<T1, 0>, Base<T2,
1>, ..., Base<Tn, N-1> ! を多重継承しているときDerived型オブジェクトの暗黙のアップキャストを試みる 要素アクセスの実装方針
38.
型のMAP インデックスkさえ与えればインデックスの一意性から継承元Base<T, k>を一意に 特定出来るので型Tの部分は推論させることが出来る 要素アクセスの実装方針
39.
型のMAP template <size_t... Indices,
typename... Types> struct type_vector_impl<index_tuple<Indices...>, Types...> : indexed_type<Types, Indices>... { // N個のindexed_typeを多重継承 template <size_t N, typename T> static T get_impl(indexed_type<T, N>); // Nが与えられれば、推論でTは取れる template <size_t N> static auto get() -> decltype(get_impl<N>( declval<type_vector_impl<index_tuple<Indices...>, Types...>>())); ! template <size_t N> using at = typename decltype(get<N>())::type; }; type_vector<int, char, double>::at<2>; // double 要素アクセスの実装
40.
パフォーマンス 型のMAP この実装ではコンテナの構築時にindex_rangeをただ1度だけ呼ぶ、それ 以降は、template argument deductionで任意のインデックスの型が取れ る、要素アクセスは高速で再帰深度も抑えられている
41.
同様にしてtupleも実装出来る (*thisとインデックスNのペアから値を保持している継承元へアップキャスト) 型のMAP template <size_t N,
typename T> constexpr const typename T::type& get_impl(const value_holder<T, N>& value) const noexcept { return value(); } ! template <size_t N> constexpr const value_type<N>& get() const noexcept { return get_impl<N>(*this); } 参考 : 再帰深度を抑えたtuple的コンテナの構築 http://?mbul.hateblo.jp/entry/2014/05/25/014112
42.
まとめ ? 多重継承とアップキャストを利用して型(或いは非型テンプ レートパラメータ)でmapのようなものが実現出来る ? Key側は一意な必要がある(例は一意なインデックスを用いた) ?
要素アクセスが速く、再帰深度も抑えられるので非常に有用 型のMAP
43.
その他の技法 ? 二分探索法 再帰で簡単に実装可能、計算量?再帰深度改善が見込める ? 倍分再帰 対象範囲を倍々にしながら再帰的に処理を適用する技法 Sproutで再帰深度を抑えたC++11
constexpr対応distanceの実 装等に使用、解説はあるので以下を参考にすると良い 参考: constexpr アルゴリズムの実装イディオム その1 http://boleros.hateblo.jp/entry/20130221/1361453624
Download