Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
EN
Uploaded by
Akira Takahashi
5,670 views
C++14 variable templates
Read more
8
Save
Share
Embed
Embed presentation
Download
Downloaded 11 times
1
/ 18
2
/ 18
3
/ 18
4
/ 18
5
/ 18
6
/ 18
7
/ 18
8
/ 18
9
/ 18
10
/ 18
11
/ 18
12
/ 18
13
/ 18
14
/ 18
15
/ 18
16
/ 18
17
/ 18
18
/ 18
More Related Content
PDF
Executors and schedulers
by
Akira Takahashi
PDF
C++14 relaxing constraints on constexpr
by
Akira Takahashi
PDF
C++14 binary literals
by
Akira Takahashi
PPTX
契約プログラミング
by
Oda Shinsuke
PDF
Riverpodでテストを書こう
by
Shinnosuke Tokuda
PDF
C++0x concept
by
Akira Takahashi
PDF
C++コンパイラ GCCとClangからのメッセージをお読みください
by
digitalghost
PDF
テンプレートメタプログラミング as 式
by
digitalghost
Executors and schedulers
by
Akira Takahashi
C++14 relaxing constraints on constexpr
by
Akira Takahashi
C++14 binary literals
by
Akira Takahashi
契約プログラミング
by
Oda Shinsuke
Riverpodでテストを書こう
by
Shinnosuke Tokuda
C++0x concept
by
Akira Takahashi
C++コンパイラ GCCとClangからのメッセージをお読みください
by
digitalghost
テンプレートメタプログラミング as 式
by
digitalghost
Viewers also liked
PPTX
C++ tips1 #include編
by
道化師 堂華
PPTX
ナウなヤングにバカうけのイカしたタグ付き共用体
by
digitalghost
PPTX
C++ tips4 cv修飾編
by
道化師 堂華
PPTX
C++ tips 3 カンマ演算子編
by
道化師 堂華
PDF
C++ tips2 インクリメント編
by
道化師 堂華
PDF
Learning Template Library Design using Boost.Geomtry
by
Akira Takahashi
PDF
Boost tour 1_61_0 merge
by
Akira Takahashi
PDF
C++1z draft
by
Akira Takahashi
PDF
C++ マルチスレッド 入門
by
京大 マイコンクラブ
PDF
よいコード、わるいコード
by
京大 マイコンクラブ
PDF
インフラエンジニアがUnityをやるべきたった一つの理由
by
axsh co., LTD.
PDF
プログラムを高速化する話
by
京大 マイコンクラブ
C++ tips1 #include編
by
道化師 堂華
ナウなヤングにバカうけのイカしたタグ付き共用体
by
digitalghost
C++ tips4 cv修飾編
by
道化師 堂華
C++ tips 3 カンマ演算子編
by
道化師 堂華
C++ tips2 インクリメント編
by
道化師 堂華
Learning Template Library Design using Boost.Geomtry
by
Akira Takahashi
Boost tour 1_61_0 merge
by
Akira Takahashi
C++1z draft
by
Akira Takahashi
C++ マルチスレッド 入門
by
京大 マイコンクラブ
よいコード、わるいコード
by
京大 マイコンクラブ
インフラエンジニアがUnityをやるべきたった一つの理由
by
axsh co., LTD.
プログラムを高速化する話
by
京大 マイコンクラブ
More from Akira Takahashi
PPTX
Cpp20 overview language features
by
Akira Takahashi
PDF
Cppmix 02
by
Akira Takahashi
PPTX
Cppmix 01
by
Akira Takahashi
PDF
Modern C++ Learning
by
Akira Takahashi
PDF
cpprefjp documentation
by
Akira Takahashi
PDF
Boost tour 1_61_0
by
Akira Takahashi
PDF
error handling using expected
by
Akira Takahashi
PDF
Boost tour 1.60.0 merge
by
Akira Takahashi
PDF
Boost tour 1.60.0
by
Akira Takahashi
PDF
Boost container feature
by
Akira Takahashi
PDF
Boost Tour 1_58_0 merge
by
Akira Takahashi
PDF
Boost Tour 1_58_0
by
Akira Takahashi
PDF
C++14 solve explicit_default_constructor
by
Akira Takahashi
PDF
C++14 enum hash
by
Akira Takahashi
PDF
Multi paradigm design
by
Akira Takahashi
PDF
Start Concurrent
by
Akira Takahashi
PDF
Programmer mind
by
Akira Takahashi
PDF
Boost.Study 14 Opening
by
Akira Takahashi
PDF
Improvement future api
by
Akira Takahashi
PDF
Leaning random using Boost Random
by
Akira Takahashi
Cpp20 overview language features
by
Akira Takahashi
Cppmix 02
by
Akira Takahashi
Cppmix 01
by
Akira Takahashi
Modern C++ Learning
by
Akira Takahashi
cpprefjp documentation
by
Akira Takahashi
Boost tour 1_61_0
by
Akira Takahashi
error handling using expected
by
Akira Takahashi
Boost tour 1.60.0 merge
by
Akira Takahashi
Boost tour 1.60.0
by
Akira Takahashi
Boost container feature
by
Akira Takahashi
Boost Tour 1_58_0 merge
by
Akira Takahashi
Boost Tour 1_58_0
by
Akira Takahashi
C++14 solve explicit_default_constructor
by
Akira Takahashi
C++14 enum hash
by
Akira Takahashi
Multi paradigm design
by
Akira Takahashi
Start Concurrent
by
Akira Takahashi
Programmer mind
by
Akira Takahashi
Boost.Study 14 Opening
by
Akira Takahashi
Improvement future api
by
Akira Takahashi
Leaning random using Boost Random
by
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