Enviar búsqueda
Cargar
C++14 variable templates
•
8 recomendaciones
•
5,657 vistas
Akira Takahashi
Seguir
Denunciar
Compartir
Denunciar
Compartir
1 de 18
Descargar ahora
Descargar para leer sin conexión
Recomendados
Executors and schedulers
Executors and schedulers
Akira Takahashi
C++14 relaxing constraints on constexpr
C++14 relaxing constraints on constexpr
Akira Takahashi
C++14 binary literals
C++14 binary literals
Akira Takahashi
契約プログラミング
契約プログラミング
Oda Shinsuke
Riverpodでテストを書こう
Riverpodでテストを書こう
Shinnosuke Tokuda
C++0x concept
C++0x concept
Akira Takahashi
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式
digitalghost
Recomendados
Executors and schedulers
Executors and schedulers
Akira Takahashi
C++14 relaxing constraints on constexpr
C++14 relaxing constraints on constexpr
Akira Takahashi
C++14 binary literals
C++14 binary literals
Akira Takahashi
契約プログラミング
契約プログラミング
Oda Shinsuke
Riverpodでテストを書こう
Riverpodでテストを書こう
Shinnosuke Tokuda
C++0x concept
C++0x concept
Akira Takahashi
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式
digitalghost
C++ tips1 #include編
C++ tips1 #include編
道化師 堂華
ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体
digitalghost
C++ tips4 cv修飾編
C++ tips4 cv修飾編
道化師 堂華
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
道化師 堂華
C++ tips2 インクリメント編
C++ tips2 インクリメント編
道化師 堂華
Learning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.Geomtry
Akira Takahashi
Boost tour 1_61_0 merge
Boost tour 1_61_0 merge
Akira Takahashi
C++1z draft
C++1z draft
Akira Takahashi
C++ マルチスレッド 入門
C++ マルチスレッド 入門
京大 マイコンクラブ
よいコード、わるいコード
よいコード、わるいコード
京大 マイコンクラブ
インフラエンジニアがUnityをやるべきたった一つの理由
インフラエンジニアがUnityをやるべきたった一つの理由
axsh co., LTD.
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
C# design note sep 2014
C# design note sep 2014
信之 岩永
C#とJavaの違い
C#とJavaの違い
KenjiroUehara
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
Tomoharu ASAMI
最先端NLP勉強会2017_ACL17
最先端NLP勉強会2017_ACL17
Masayoshi Kondo
qmake入門
qmake入門
hermit4 Ishida
Skinny Controllers, Skinny Models
Skinny Controllers, Skinny Models
Kazuhiro Sera
CMSI計算科学技術特論C (2015) OpenMX とDFT②
CMSI計算科学技術特論C (2015) OpenMX とDFT②
Computational Materials Science Initiative
N3701 concept lite
N3701 concept lite
Takatoshi Kondo
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
Kiyoshi Ogawa
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
和弘 井之上
Más contenido relacionado
Destacado
C++ tips1 #include編
C++ tips1 #include編
道化師 堂華
ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体
digitalghost
C++ tips4 cv修飾編
C++ tips4 cv修飾編
道化師 堂華
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
道化師 堂華
C++ tips2 インクリメント編
C++ tips2 インクリメント編
道化師 堂華
Learning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.Geomtry
Akira Takahashi
Boost tour 1_61_0 merge
Boost tour 1_61_0 merge
Akira Takahashi
C++1z draft
C++1z draft
Akira Takahashi
C++ マルチスレッド 入門
C++ マルチスレッド 入門
京大 マイコンクラブ
よいコード、わるいコード
よいコード、わるいコード
京大 マイコンクラブ
インフラエンジニアがUnityをやるべきたった一つの理由
インフラエンジニアがUnityをやるべきたった一つの理由
axsh co., LTD.
プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
Destacado
(12)
C++ tips1 #include編
C++ tips1 #include編
ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体
C++ tips4 cv修飾編
C++ tips4 cv修飾編
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編
C++ tips2 インクリメント編
C++ tips2 インクリメント編
Learning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.Geomtry
Boost tour 1_61_0 merge
Boost tour 1_61_0 merge
C++1z draft
C++1z draft
C++ マルチスレッド 入門
C++ マルチスレッド 入門
よいコード、わるいコード
よいコード、わるいコード
インフラエンジニアがUnityをやるべきたった一つの理由
インフラエンジニアがUnityをやるべきたった一つの理由
プログラムを高速化する話
プログラムを高速化する話
Similar a C++14 variable templates
C# design note sep 2014
C# design note sep 2014
信之 岩永
C#とJavaの違い
C#とJavaの違い
KenjiroUehara
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
Tomoharu ASAMI
最先端NLP勉強会2017_ACL17
最先端NLP勉強会2017_ACL17
Masayoshi Kondo
qmake入門
qmake入門
hermit4 Ishida
Skinny Controllers, Skinny Models
Skinny Controllers, Skinny Models
Kazuhiro Sera
CMSI計算科学技術特論C (2015) OpenMX とDFT②
CMSI計算科学技術特論C (2015) OpenMX とDFT②
Computational Materials Science Initiative
N3701 concept lite
N3701 concept lite
Takatoshi Kondo
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
Kiyoshi Ogawa
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
和弘 井之上
What is template
What is template
Akira Takahashi
C# 8
C# 8
m ishizaki
わんくま名古屋 #37 (20151114) TDD道場 #25
わんくま名古屋 #37 (20151114) TDD道場 #25
Yasuhiko Yamamoto
CMSI計算科学技術特論C (2015) 可読性と性能の両立を目指して
CMSI計算科学技術特論C (2015) 可読性と性能の両立を目指して
Computational Materials Science Initiative
Scala + Finagleの魅力
Scala + Finagleの魅力
Kota Mizushima
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
Shohei Okada
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
Tomoharu ASAMI
Coderetreat
Coderetreat
YAMANE Toshiaki
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
Tomoharu ASAMI
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
Y Watanabe
Similar a C++14 variable templates
(20)
C# design note sep 2014
C# design note sep 2014
C#とJavaの違い
C#とJavaの違い
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
最先端NLP勉強会2017_ACL17
最先端NLP勉強会2017_ACL17
qmake入門
qmake入門
Skinny Controllers, Skinny Models
Skinny Controllers, Skinny Models
CMSI計算科学技術特論C (2015) OpenMX とDFT②
CMSI計算科学技術特論C (2015) OpenMX とDFT②
N3701 concept lite
N3701 concept lite
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
「C言語規格&MISRA-C:みんなで楽しいCプログラミング」NGK2013B名古屋合同懇親会2013忘年会昼の部
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第2回 ‟変数と型„
What is template
What is template
C# 8
C# 8
わんくま名古屋 #37 (20151114) TDD道場 #25
わんくま名古屋 #37 (20151114) TDD道場 #25
CMSI計算科学技術特論C (2015) 可読性と性能の両立を目指して
CMSI計算科学技術特論C (2015) 可読性と性能の両立を目指して
Scala + Finagleの魅力
Scala + Finagleの魅力
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
Coderetreat
Coderetreat
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
Más de Akira Takahashi
Cpp20 overview language features
Cpp20 overview language features
Akira Takahashi
Cppmix 02
Cppmix 02
Akira Takahashi
Cppmix 01
Cppmix 01
Akira Takahashi
Modern C++ Learning
Modern C++ Learning
Akira Takahashi
cpprefjp documentation
cpprefjp documentation
Akira Takahashi
Boost tour 1_61_0
Boost tour 1_61_0
Akira Takahashi
error handling using expected
error handling using expected
Akira Takahashi
Boost tour 1.60.0 merge
Boost tour 1.60.0 merge
Akira Takahashi
Boost tour 1.60.0
Boost tour 1.60.0
Akira Takahashi
Boost container feature
Boost container feature
Akira Takahashi
Boost Tour 1_58_0 merge
Boost Tour 1_58_0 merge
Akira Takahashi
Boost Tour 1_58_0
Boost Tour 1_58_0
Akira Takahashi
C++14 solve explicit_default_constructor
C++14 solve explicit_default_constructor
Akira Takahashi
C++14 enum hash
C++14 enum hash
Akira Takahashi
Multi paradigm design
Multi paradigm design
Akira Takahashi
Start Concurrent
Start Concurrent
Akira Takahashi
Programmer mind
Programmer mind
Akira Takahashi
Boost.Study 14 Opening
Boost.Study 14 Opening
Akira Takahashi
Improvement future api
Improvement future api
Akira Takahashi
Leaning random using Boost Random
Leaning random using Boost Random
Akira Takahashi
Más de Akira Takahashi
(20)
Cpp20 overview language features
Cpp20 overview language features
Cppmix 02
Cppmix 02
Cppmix 01
Cppmix 01
Modern C++ Learning
Modern C++ Learning
cpprefjp documentation
cpprefjp documentation
Boost tour 1_61_0
Boost tour 1_61_0
error handling using expected
error handling using expected
Boost tour 1.60.0 merge
Boost tour 1.60.0 merge
Boost tour 1.60.0
Boost tour 1.60.0
Boost container feature
Boost container feature
Boost Tour 1_58_0 merge
Boost Tour 1_58_0 merge
Boost Tour 1_58_0
Boost Tour 1_58_0
C++14 solve explicit_default_constructor
C++14 solve explicit_default_constructor
C++14 enum hash
C++14 enum hash
Multi paradigm design
Multi paradigm design
Start Concurrent
Start Concurrent
Programmer mind
Programmer mind
Boost.Study 14 Opening
Boost.Study 14 Opening
Improvement future api
Improvement future api
Leaning random using Boost Random
Leaning random using Boost Random
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
Descargar ahora