Submit Search
C++14 variable templates
8 likes
5,665 views
Akira Takahashi
1 of 18
Download now
Downloaded 11 times
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
More Related Content
PDF
Executors and schedulers
Akira Takahashi
PDF
C++14 relaxing constraints on constexpr
Akira Takahashi
PDF
C++14 binary literals
Akira Takahashi
PPTX
契約プログラミング
Oda Shinsuke
PDF
Riverpodでテストを書こう
Shinnosuke Tokuda
PDF
C++0x concept
Akira Takahashi
PDF
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
PDF
テンプレートメタプログラミング as 式
digitalghost
Executors and schedulers
Akira Takahashi
C++14 relaxing constraints on constexpr
Akira Takahashi
C++14 binary literals
Akira Takahashi
契約プログラミング
Oda Shinsuke
Riverpodでテストを書こう
Shinnosuke Tokuda
C++0x concept
Akira Takahashi
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
テンプレートメタプログラミング as 式
digitalghost
Viewers also liked
(12)
PPTX
C++ tips1 #include編
道化師 堂華
PPTX
ナウなヤングにバカうけのイカしたタグ付き共用体
digitalghost
PPTX
C++ tips4 cv修飾編
道化師 堂華
PPTX
C++ tips 3 カンマ演算子編
道化師 堂華
PDF
C++ tips2 インクリメント編
道化師 堂華
PDF
Learning Template Library Design using Boost.Geomtry
Akira Takahashi
PDF
Boost tour 1_61_0 merge
Akira Takahashi
PDF
C++1z draft
Akira Takahashi
PDF
C++ マルチスレッド 入門
京大 マイコンクラブ
PDF
よいコード、わるいコード
京大 マイコンクラブ
PDF
インフラエンジニアがUnityをやるべきたった一つの理由
axsh co., LTD.
PDF
プログラムを高速化する話
京大 マイコンクラブ
C++ tips1 #include編
道化師 堂華
ナウなヤングにバカうけのイカしたタグ付き共用体
digitalghost
C++ tips4 cv修飾編
道化師 堂華
C++ tips 3 カンマ演算子編
道化師 堂華
C++ tips2 インクリメント編
道化師 堂華
Learning Template Library Design using Boost.Geomtry
Akira Takahashi
Boost tour 1_61_0 merge
Akira Takahashi
C++1z draft
Akira Takahashi
C++ マルチスレッド 入門
京大 マイコンクラブ
よいコード、わるいコード
京大 マイコンクラブ
インフラエンジニアがUnityをやるべきたった一つの理由
axsh co., LTD.
プログラムを高速化する話
京大 マイコンクラブ
Ad
Similar to C++14 variable templates
(20)
PPTX
C# design note sep 2014
信之 岩永
PPTX
C#とJavaの違い
KenjiroUehara
PDF
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
Tomoharu ASAMI
PDF
最先端NLP勉強会2017_ACL17
Masayoshi Kondo
PDF
qmake入門
hermit4 Ishida
PDF
Skinny Controllers, Skinny Models
Kazuhiro Sera
PDF
CMSI計算科学技術特論C (2015) OpenMX とDFT②
Computational Materials Science Initiative
PPTX
N3701 concept lite
Takatoshi Kondo
PPT
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
Kiyoshi Ogawa
PDF
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
和弘 井之上
PDF
What is template
Akira Takahashi
PPTX
C# 8
m ishizaki
PPTX
わんくま名古屋 #37 (20151114) TDD道場 #25
Yasuhiko Yamamoto
PDF
PostgreSQL17対応版 EXPLAINオプションについて (第49回PostgreSQLアンカンファレンス@東京 発表資料)
NTT DATA Technology & Innovation
PDF
CMSI計算科学技術特論C (2015) 可読性と性能の両立を目指して
Computational Materials Science Initiative
PDF
Scala + Finagleの魅力
Kota Mizushima
PDF
PHP 2大 web フレームワークの徹底比較!
Shohei Okada
PDF
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
Tomoharu ASAMI
PDF
Coderetreat
YAMANE Toshiaki
PDF
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
Tomoharu ASAMI
C# design note sep 2014
信之 岩永
C#とJavaの違い
KenjiroUehara
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
Tomoharu ASAMI
最先端NLP勉強会2017_ACL17
Masayoshi Kondo
qmake入門
hermit4 Ishida
Skinny Controllers, Skinny Models
Kazuhiro Sera
CMSI計算科学技術特論C (2015) OpenMX とDFT②
Computational Materials Science Initiative
N3701 concept lite
Takatoshi Kondo
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
Kiyoshi Ogawa
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
和弘 井之上
What is template
Akira Takahashi
C# 8
m ishizaki
わんくま名古屋 #37 (20151114) TDD道場 #25
Yasuhiko Yamamoto
PostgreSQL17対応版 EXPLAINオプションについて (第49回PostgreSQLアンカンファレンス@東京 発表資料)
NTT DATA Technology & Innovation
CMSI計算科学技術特論C (2015) 可読性と性能の両立を目指して
Computational Materials Science Initiative
Scala + Finagleの魅力
Kota Mizushima
PHP 2大 web フレームワークの徹底比較!
Shohei Okada
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
Tomoharu ASAMI
Coderetreat
YAMANE Toshiaki
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
Tomoharu ASAMI
Ad
More from Akira Takahashi
(20)
PPTX
Cpp20 overview language features
Akira Takahashi
PDF
Cppmix 02
Akira Takahashi
PPTX
Cppmix 01
Akira Takahashi
PDF
Modern C++ Learning
Akira Takahashi
PDF
cpprefjp documentation
Akira Takahashi
PDF
Boost tour 1_61_0
Akira Takahashi
PDF
error handling using expected
Akira Takahashi
PDF
Boost tour 1.60.0 merge
Akira Takahashi
PDF
Boost tour 1.60.0
Akira Takahashi
PDF
Boost container feature
Akira Takahashi
PDF
Boost Tour 1_58_0 merge
Akira Takahashi
PDF
Boost Tour 1_58_0
Akira Takahashi
PDF
C++14 solve explicit_default_constructor
Akira Takahashi
PDF
C++14 enum hash
Akira Takahashi
PDF
Multi paradigm design
Akira Takahashi
PDF
Start Concurrent
Akira Takahashi
PDF
Programmer mind
Akira Takahashi
PDF
Boost.Study 14 Opening
Akira Takahashi
PDF
Improvement future api
Akira Takahashi
PDF
Leaning random using Boost Random
Akira Takahashi
Cpp20 overview language features
Akira Takahashi
Cppmix 02
Akira Takahashi
Cppmix 01
Akira Takahashi
Modern C++ Learning
Akira Takahashi
cpprefjp documentation
Akira Takahashi
Boost tour 1_61_0
Akira Takahashi
error handling using expected
Akira Takahashi
Boost tour 1.60.0 merge
Akira Takahashi
Boost tour 1.60.0
Akira Takahashi
Boost container feature
Akira Takahashi
Boost Tour 1_58_0 merge
Akira Takahashi
Boost Tour 1_58_0
Akira Takahashi
C++14 solve explicit_default_constructor
Akira Takahashi
C++14 enum hash
Akira Takahashi
Multi paradigm design
Akira Takahashi
Start Concurrent
Akira Takahashi
Programmer mind
Akira Takahashi
Boost.Study 14 Opening
Akira Takahashi
Improvement future api
Akira Takahashi
Leaning random using Boost Random
Akira Takahashi
C++14 variable templates
1.
C++14 変数テンプレート 高橋 晶(Akira Takahashi) faithandbrave@longgate.co.jp 2013/10/26(土)
C++14規格レビュー勉強会
2.
はじめに • この発表は、C++14のコア言語に導入される予定の 「変数テンプレート(Variable Templates)」に関するレビュー資料です。 • 提案文書: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3651.pdf • 日本語訳: http://dl.dropboxusercontent.com/u/1682460/translation/C++14/ n3651_variable_templates.html
3.
概要 • この提案の狙いは、パラメータ化された定数の定義と使用をシンプルにす ることである。 • これは、constexpr変数テンプレート(Variable Templates)の宣言によっ て許可する。 • その結果として、よりシンプルなプログラミングルールを覚えやすくす る。これによって、現在知られている回避策を、より予測可能な慣習と意 味論で置き換える。
4.
変数テンプレートの使い方 • 数学の定数であるπを、浮動小数点数型の精度を指定して直接的に表現し たい。 template <typename T> constexpr
T pi = T(3.1415926535897932385);
5.
変数テンプレートの使い方 • そしてこれをジェネリックな関数内で使用したい。たとえば、与えられた 半径から円の面積を計算する。 template <typename T> T
area_of_circle_with_radius(T r) { return pi<T> * r * r; }
6.
変数テンプレートの使い方 • 変数テンプレートの型は、組み込み型に制限されない。ユーザー定義型も 使用可能だ。 • たとえば、ここにパウリ行列(Pauli matrices)の基本的な定義がある(これ は量子力学で使用する)。 template <typename
T> constexpr pauli<T> sigma1 = { { 0, 1 }, { 1, 0 } }; template <typename T> constexpr pauli<T> sigma2 = { { 0, -1i }, { 1i, 0 } }; template <typename T> constexpr pauli<T> sigma3 = { { 1, 0 }, { -1, 0 } }; • pauli<T>は2x2行列のcomplex<T>型として定義される。
7.
これまでの回避策 • 変数テンプレート宣言がないC++11までは、以下の2つの回避策がとられ ていた。 • クラステンプレートのconstexpr静的データメンバ • constexpr関数テンプレートによって返される結果値
8.
回避策1. constexpr静的データメンバ • 標準のstd::numeric_limitsクラスで、この回避策がとられている。 template <typename
T> struct numeric_limits { static constexpr bool is_modulo = ...; }; // ... template <typename T> constexpr bool numeric_limits<T>::is_modulo;
9.
回避策1. constexpr静的データメンバ 静的データメンバの主な問題: • それらは「重複する」宣言を要求する: その定数がodr-usedである場合、 クラステンプレートの内側に一度、クラステンプレートの外側に一度、 「本物の(real)」定義を提供する。 • プログラマは、同じ宣言を2回宣言する必要性に怒り、混乱する。 対照的に、「普通の(ordinary)」定数宣言では重複した宣言は必要ない。 つまり何を言ってるのか?
10.
回避策1. constexpr静的データメンバ template <class
T> struct X { static constexpr bool is_modulo = false; }; /* template <class T> constexpr bool X<T>::is_modulo; */ int main() { constexpr const bool& x = X<int>::is_modulo; // リンクエラー! } • • • 宣言しかされていない段階で、is_moduloを「使用」している。 この段階では、is_moduloに実体がないため、ポインタや参照はとれない。 上記コメントアウトを外して、is_moduloを定義しなければならない。
11.
回避策2. constexpr関数テンプレート • この回避策をとっているものには、std::numeric_limitsの静的メンバ 関数や、boost::math::constants::pi<T>()関数などがある。 • こちらの回避策では、静的データメンバが持つ「重複宣言」問題は起こら ない。 • この回避策の問題は、データの使用方法(const参照なのか非const参照な のか、もしくはコピーなのか)を、提供側が事前に選択しなければならな い、ということ。 • もしコピーを返す方法が一つだけ用意されていたとして、組み込み型なら 大した問題にはならないが、行列や多倍長演算型の場合に致命的になる。
12.
解決策 constexpr変数テンプレートを使いましょう
13.
具体的な規格の変更内容 • もともと、構文的にはあらゆる宣言にテンプレートを付けることが可能に なっている。 • 規格への変更内容は、変数宣言をテンプレートの許可リストに加えるだけ。
14.
特殊化について • 変数テンプレートは、特殊化、および部分特殊化をサポートする。
15.
所感 • 元々浅い理解だったときは、constexpr関数で十分だと考えていたが、 odr-usedと、使用方法のユーザー側選択の説明で、納得が行った。 • 懸念事項としては、変数テンプレートは可変個変数とかができてしまうは ずなので、 「テンプレートがいくつインスタンス化されたかの個数と、インスタンス化 された型リストを取得したい」 という要望が出てきそうで怖いと感じた。 • • → でもそれは静的データメンバも同じだった。 現状の機能と動機については、全く問題ないと考える。
16.
可変個変数 • テンプレートパラメータごとに異なるインスタンスを持つので、同じ変数名 でも別な型と値を持てる。(Clang 3.5になる予定のtrunkで確認) template<int x> constexpr
char y = 3; template<> constexpr double y<42> = 2.5; int main() { constexpr char c = y<17>; constexpr double d = y<42>; } static_assert(c == 3, ""); static_assert(d == 2.5, ""); http://stackoverflow.com/questions/19108345/c1y-c14-variable-template-specialization
17.
標準ライブラリへの採用展望 • C++14での、Type Traitsのエイリアステンプレート版追加にともない、 同提案者のVicente J.
Botet Escribaさんが、値を返すメタ関数の変数テン プレート版を提案しようとしている(C++14には間に合わないだろう)。 • RFC: TypeTraits Variables - std-proposals https://groups.google.com/a/isocpp.org/forum/? hl=en&fromgroups#!topic/std-proposals/QOYLLJjH98k template<typename T> constexpr bool is_reference_c = is_reference<T>::value;
18.
参考文献 • N3552 Walter Brown.
Introducing Object Aliases. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3552.pdf • N3615 Gabriel Dos Reis. Constexpr Variable Templates. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3615.pdf
Download