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
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.8k
C++20 射影変換
faithandbrave
0
690
C++26アップデート 2025-03
faithandbrave
0
1.8k
C++26 エラー性動作
faithandbrave
2
1.2k
C++20の整数
faithandbrave
0
240
コンテナと文字列の中間インタフェースspanとstring_view
faithandbrave
1
590
C++23 スタックトレースライブラリ
faithandbrave
0
550
使いたい標準C++機能がない環境でいかに実装・設計するか
faithandbrave
2
1.2k
C++20からC++23までの変化
faithandbrave
9
12k
Other Decks in Programming
See All in Programming
業務でAIを使いたい話
hnw
0
260
Introducing RemoteCompose: break your UI out of the app sandbox.
camaelon
2
540
Verilator + Rust + gRPC と Efinix の RISC-V でAIアクセラレータをAIで作ってる話 RTLを語る会(18) 2025/11/08
ryuz88
0
340
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
430
「正規表現をつくる」をつくる / make "make regex"
makenowjust
1
200
FlutterKaigi 2025 システム裏側
yumnumm
0
750
Vueで学ぶデータ構造入門 リンクリストとキューでリアクティビティを捉える / Vue Data Structures: Linked Lists and Queues for Reactivity
konkarin
1
170
Temporal Knowledge Graphで作る! 時間変化するナレッジを扱うAI Agentの世界
po3rin
5
1.3k
高単価案件で働くための心構え
nullnull
0
110
Private APIの呼び出し方
kishikawakatsumi
2
830
詳細の決定を遅らせつつ実装を早くする
shimabox
1
990
JJUG CCC 2025 Fall: Virtual Thread Deep Dive
ternbusty
3
120
Featured
See All Featured
The Language of Interfaces
destraynor
162
25k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Producing Creativity
orderedlist
PRO
348
40k
Build The Right Thing And Hit Your Dates
maggiecrowley
38
2.9k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
127
54k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.8k
Done Done
chrislema
186
16k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
253
22k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.3k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
192
56k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
37
2.6k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.7k
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