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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Akira Takahashi
April 19, 2024
Programming
3
1.5k
if constexpr文はテンプレート世界のラムダ式である
Akira Takahashi
April 19, 2024
Tweet
Share
More Decks by Akira Takahashi
See All by Akira Takahashi
P2P通信の標準化 WebRTCを知ろう
faithandbrave
6
3.1k
C++20 射影変換
faithandbrave
0
760
C++26アップデート 2025-03
faithandbrave
0
2.1k
C++26 エラー性動作
faithandbrave
2
1.2k
C++20の整数
faithandbrave
0
270
コンテナと文字列の中間インタフェースspanとstring_view
faithandbrave
1
620
C++23 スタックトレースライブラリ
faithandbrave
0
600
使いたい標準C++機能がない環境でいかに実装・設計するか
faithandbrave
2
1.3k
C++20からC++23までの変化
faithandbrave
9
12k
Other Decks in Programming
See All in Programming
PHPのバージョンアップ時にも役立ったAST(2026年版)
matsuo_atsushi
0
240
20260315 AWSなんもわからん🥲
chiilog
2
170
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
570
実践ハーネスエンジニアリング #MOSHTech
kajitack
1
160
今年もTECHSCOREブログを書き続けます!
hiraoku101
0
120
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
770
AI時代の脳疲弊と向き合う ~言語学としてのPHP~
sakuraikotone
1
1.5k
GoのDB アクセスにおける 「型安全」と「柔軟性」の両立 - Bob という選択肢
tak848
0
270
それはエンジニアリングの糧である:AI開発のためにAIのOSSを開発する現場より / It serves as fuel for engineering: insights from the field of developing open-source AI for AI development.
nrslib
1
490
Laravel Nightwatchの裏側 - Laravel公式Observabilityツールを支える設計と実装
avosalmon
1
140
どんと来い、データベース信頼性エンジニアリング / Introduction to DBRE
nnaka2992
1
330
今からFlash開発できるわけないじゃん、ムリムリ! (※ムリじゃなかった!?)
arkw
0
140
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.2k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.8k
Deep Space Network (abreviated)
tonyrice
0
94
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Raft: Consensus for Rubyists
vanstee
141
7.4k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
130
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
230
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
0
460
Speed Design
sergeychernyshev
33
1.6k
Unsuck your backbone
ammeep
672
58k
SEO for Brand Visibility & Recognition
aleyda
0
4.4k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
1
330
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