Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
if constexpr文はテンプレート世界のラムダ式である
Search
Akira Takahashi
April 19, 2024
Programming
3
1.4k
if constexpr文はテンプレート世界のラムダ式である
Akira Takahashi
April 19, 2024
Tweet
Share
More Decks by Akira Takahashi
See All by Akira Takahashi
P2P通信の標準化 WebRTCを知ろう
faithandbrave
6
2.9k
C++20 射影変換
faithandbrave
0
700
C++26アップデート 2025-03
faithandbrave
0
1.9k
C++26 エラー性動作
faithandbrave
2
1.2k
C++20の整数
faithandbrave
0
240
コンテナと文字列の中間インタフェースspanとstring_view
faithandbrave
1
590
C++23 スタックトレースライブラリ
faithandbrave
0
560
使いたい標準C++機能がない環境でいかに実装・設計するか
faithandbrave
2
1.2k
C++20からC++23までの変化
faithandbrave
9
12k
Other Decks in Programming
See All in Programming
「コードは上から下へ読むのが一番」と思った時に、思い出してほしい話
panda728
PRO
1
1.3k
Rediscover the Console - SymfonyCon Amsterdam 2025
chalasr
2
140
Full-Cycle Reactivity in Angular: SignalStore mit Signal Forms und Resources
manfredsteyer
PRO
0
180
AIコーディングエージェント(NotebookLM)
kondai24
0
120
「文字列→日付」の落とし穴 〜Ruby Date.parseの意外な挙動〜
sg4k0
0
360
全員アーキテクトで挑む、 巨大で高密度なドメインの紐解き方
agatan
8
18k
ID管理機能開発の裏側 高速にSaaS連携を実現したチームのAI活用編
atzzcokek
0
190
Integrating WordPress and Symfony
alexandresalome
0
120
CSC305 Lecture 17
javiergs
PRO
0
270
AI時代もSEOを頑張っている話
shirahama_x
0
230
複数人でのCLI/Infrastructure as Codeの暮らしを良くする
shmokmt
5
2.1k
GeistFabrik and AI-augmented software development
adewale
PRO
0
250
Featured
See All Featured
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.8k
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
Building Flexible Design Systems
yeseniaperezcruz
329
39k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
140
34k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
120
20k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
14k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.8k
Being A Developer After 40
akosma
91
590k
Art, The Web, and Tiny UX
lynnandtonic
303
21k
Making the Leap to Tech Lead
cromwellryan
135
9.6k
Faster Mobile Websites
deanohume
310
31k
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