Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
if constexpr文はテンプレート世界のラムダ式である
Search
Akira Takahashi
April 19, 2024
Programming
3
930
if constexpr文はテンプレート世界のラムダ式である
Akira Takahashi
April 19, 2024
Tweet
Share
More Decks by Akira Takahashi
See All by Akira Takahashi
C++20の整数
faithandbrave
0
77
コンテナと文字列の中間インタフェースspanとstring_view
faithandbrave
1
320
C++23 スタックトレースライブラリ
faithandbrave
0
280
使いたい標準C++機能がない環境でいかに実装・設計するか
faithandbrave
2
970
C++20からC++23までの変化
faithandbrave
9
12k
オープン化が進むC++の現状と展望
faithandbrave
19
11k
C++20 status
faithandbrave
0
890
Other Decks in Programming
See All in Programming
Ethereum_.pdf
nekomatu
0
460
2024/11/8 関西Kaggler会 2024 #3 / Kaggle Kernel で Gemma 2 × vLLM を動かす。
kohecchi
5
920
色々なIaCツールを実際に触って比較してみる
iriikeita
0
330
見せてあげますよ、「本物のLaravel批判」ってやつを。
77web
7
7.8k
最新TCAキャッチアップ
0si43
0
140
What’s New in Compose Multiplatform - A Live Tour (droidcon London 2024)
zsmb
1
470
Flutterを言い訳にしない!アプリの使い心地改善テクニック5選🔥
kno3a87
1
190
イベント駆動で成長して委員会
happymana
1
320
【Kaigi on Rails 2024】YOUTRUST スポンサーLT
krpk1900
1
330
Realtime API 入門
riofujimon
0
150
subpath importsで始めるモック生活
10tera
0
300
Kaigi on Rails 2024 〜運営の裏側〜
krpk1900
1
220
Featured
See All Featured
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
47
2.1k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.7k
Producing Creativity
orderedlist
PRO
341
39k
A better future with KSS
kneath
238
17k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
44
2.2k
How to train your dragon (web standard)
notwaldorf
88
5.7k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Product Roadmaps are Hard
iamctodd
PRO
49
11k
Keith and Marios Guide to Fast Websites
keithpitt
409
22k
Art, The Web, and Tiny UX
lynnandtonic
297
20k
Being A Developer After 40
akosma
86
590k
Optimising Largest Contentful Paint
csswizardry
33
2.9k
Transcript
JGDPOTUFYQSจ ςϯϓϨʔτੈքͷϥϜμࣜͰ͋Δ ߴڮ থ "LJSB5BLBIBTIJ GBJUIBOECSBWF!HNBJMDPN 1SFGFSSFE/FUXPSLT *OD ۚ
$ .*9
ࣗݾհ • 1SFGFSSFE/FUXPSLTࣾͰɺεʔύʔίϯϐϡʔλ./$PSF ͷιϑτΣΞΛ࡞͍ͬͯ·͢ • ΤϛϡϨʔλͱ͔Ξηϯϒϥͱ͔ͷϨΠϠʔͳͷΛ࡞ͬͯ·͢ • ຊͷ$ ඪ४ԽҕһձʹҰ࣌ظࢀՃ͍ͯ͠·ͨ͠ •
$ ͷຊޠϦϑΝϨϯεαΠτDQQSFGKQΛ࡞͍ͬͯ·͢ • ஶॻ • ʰ$ ςϯϓϨʔτςΫχοΫʱ • ʰ$ ϙέοτϦϑΝϨϯεʱ • ʰϓϩάϥϛϯάͷຐಋॻʱ • ࠓ$ ͷೖαΠτΛ࡞Γ͍ͨ
$ ରԠͷ$ ϙέϦ͠·ͨ͠ • ʹ$ ൛Λग़൛ͯ͠ɺ վగΛଓ͚͍ͯ·͢ • ʮΓ͍ͨ͜ͱʯ͔ΒʮͲ͏ͬͯʯ ΛௐΔٯҾ͖ϦϑΝϨϯε
• DQQSFGKQͱׂ͕ҟͳΔ • ষཱͯઆ໌ͷཻ ݴޠɾஶऀ͝ͱʹ͕ͪ͏ • $ ϙέϦɺදࢴͷΧδϡΞϧ͞ͱ ͕ͪͬͯɺॻ͖͗͢ͳ͘Β͍આ໌Λ ॻ͍͍ͯΔ
ใൃ৴Λ͠Α͏ • ঝ͞Εͳ͍ٕज़ഇΕ͍ͯ͘ • ຊΛॻ͘ਓ͕૿͑ͯ΄͍͠ • ຊͰҰ൪͍ͨΜͳͷɺॻ্͖͛Δ͜ͱ • ్தͰ͛ग़ͣ͞ɺ࠷ޙ·Ͱ࡞Γ্͛Δͷ͕Ұ൪͍ͩ͡ •
୯ൃهࣄͱ͕ͪͬͯɺຊ • Ұ؏ੑ͋Δํͷͱɺ • ମܥతͳղઆΛఏڙ͠ɺ • ϨϏϡʔʹଟ͘ͷ࣌ؒΛ͔͚Δ ग़൛ޙʹमਖ਼͕Ͱ͖ͳ͍ ͜ͱ͕େ͖ͳՁ • ग़൛ࣾͱͷڮ͠ϨϏϡʔͳͲڠྗ͠·͢
$ ͰೖͬͨJGDPOTUFYQSจͷ͓Ͱ͢ if constexpr (std::is_same_v<T, int>) { // intに関する処理… }
else { // それ以外の型の処理… } • JGDPOTUFYQSจɺίϯύΠϧ࣌݅ʹΑΔ݅ذͰ͢ • ֘͠ͳ͔ͬͨํͷذίʔυɺόΠφϦʹؚ·Ε·ͤΜ
ͱ͜ΖͰɺςϯϓϨʔτͬͯ·͔͢ʁ • ීஈͷΞϓϦέʔγϣϯ։ൃͰςϯϓϨʔτ͍ͬͯ·͢ ͔ʁ • $ ͷࠒɺςϯϓϨʔτΛ͏ͱʮࠇຐज़ͩʯͱ͔ɺ ʮແବʹෳࡶͳ͜ͱΛͯ͠Δʯͱ͔ݴΘΕͨΓ͠·͕ͨ͠ • $
͔Β͍ͩͿ͍͘͢ͳΓ·ͨ͠ • ࢲϥΠϒϥϦ͚ͩͰͳ͘ɺΞϓϦέʔγϣϯ։ൃͰςϯϓ Ϩʔτීஈ͔Β͍ͬͯ·͢
ςϯϓϨʔτͱ • ςϯϓϨʔτɺύϥϝλϥΠζυɾλΠϓͱ͔ݴΘΕͨΓ͢ ΔͷͰɺܕΛύϥϝʔλԽ͢ΔΈͰ͢ • ܕʹΑΒͳ͍ॲཧΛڞ௨ԽͰ͖·͢ • $ ݱࡏ͍ΖΜͳͷΛςϯϓϨʔτʹͰ͖·͢ •
ؔςϯϓϨʔτ • ΫϥεςϯϓϨʔτ • ܕͷผ໊ςϯϓϨʔτ $ • มςϯϓϨʔτ $
ϥϜμࣜͱJGDPOTUFYQSͷಛ • ϥϜμࣜ • ͦͷ ؔϩʔΧϧ Ͱͪΐͬͱͨ͠ʮؔʯΛఆٛͰ͖Δ • JGDPOTUFYQSจ •
ͦͷͰʮಛఆͷܕʹର͢Δͪΐͬͱͨ͠ॲཧʯΛڬΈࠐΊΔ
ڬΈࠐΈ͍ͨͪΐͬͱͨ͠ॲཧ template <class T> void f() { if constexpr (typeid(T)
== typeid(int)) { // …前処理… } // …共通の処理… } • ͨͱ͑લॲཧ • ͜ΕΛΦʔόʔϩʔυͰΖ͏ͱ͢Δͱ • ؔͷมΛͨ͠Γ͕ΊΜͲ͏ • ίʔυ͕ࢄΒΔ
ΦʔόʔϩʔυͷΊΜͲ͏͞Λߟ͑Δ void f_impl(int x, double a, std::string b) { //
…intに対する処理… } template <class T> void f_impl(T, double, std::string) { // …それ以外の型ではなにもしない… } • ಛఆͷܕҎ֎ʹର͢ΔۭͷؔΛఆٛ͢Δඞཁ͕͋Δ • Ҿ͠ͷίετ Ϝʔϒͱ͔EFDMWBMͱ͔ Λ·͡Ίʹߟ͑Δ ඞཁ͕͋Δ
ྫɿ΄ͱΜͲಉ͡ྻڍࢠΛͭྻڍܕͷϋϯυϦϯά enum class A { a, b }; enum class
B { a, b, c }; template <class E> string enum_to_string(E e) { if constexpr (requires{ E::c; }) { if (e == E::c) return "c"; } switch (e) { …a, bの文字列化… } } • จࣈྻԽ͚ͩͰͳ͘ɺྻڍࢠΛܕʹมɾରԠͤ͞Δ໘Ͱ ͑Δ
͍ͩ͡ͳ͜ͱ • JGDPOTUFYQSΛڬΈࠐΉͷɺʮͪΐͬͱͨ͠ʯॲཧͰ͋Δ ͱ͍͏͜ͱ • ϥϜμࣜͱಉ͘͡ɺେ͖͘ͳ͖ͬͯͨΒؔΛ͚Δ͜ͱΛ ߟ͑Α͏
·ͱΊ • JGDPOTUFYQSจɺ • ؔͰಛఆͷܕʹର͢Δͪΐͬͱͨ͠ॲཧΛڬΈࠐΊͯศར • ؔΦʔόʔϩʔυͱҧͬͯɺ • มΛ࣋ͪӡͳ͍ͰࡁΉ •
ର֎ͷܕʹର͢ΔۭͷؔΛఆٛ͠ͳ͍ͰࡁΉ
JGDPOTUFYQSͷͦͷଞͷ • $ ن֨తʹʮDPOTUFYQS JGTUBUFNFOUʯͱ͍͏໊শͰ ʮJGDPOTUFYQS ݅ࣜ ʯ͕ೖ͍ͬͯΔ • ߏจͷ߹
• DPOTUFYQS JG ݅ࣜ ͩͱFMTFͷํDPOTUFYQS FMTFʹͳͬͯ͠·͏ • ͜͜Ͱػೳ໊ͱͯ͠JGDPOTUFYQSΛݴͬͯ·͢ • %ݴޠͰTUBUJDJGจͱ͍͏ͷ͕͋ΓɺͦͪΒείʔϓΛੜ͠ ͳ͍ͷͰศར • ܕͷఆٛΛذͨ͠Γɺ݅͝ͱʹڞ௨ͷมΛ࡞ΕͨΓʜ • JGDPOTUFYQS ݅ࣜ \JOUYʜ^FMTF\5Yʜ^ G Y