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.2k
if constexpr文はテンプレート世界のラムダ式である
Akira Takahashi
April 19, 2024
Tweet
Share
More Decks by Akira Takahashi
See All by Akira Takahashi
C++26アップデート 2025-03
faithandbrave
0
1.2k
C++26 エラー性動作
faithandbrave
2
1.1k
C++20の整数
faithandbrave
0
180
コンテナと文字列の中間インタフェースspanとstring_view
faithandbrave
1
470
C++23 スタックトレースライブラリ
faithandbrave
0
450
使いたい標準C++機能がない環境でいかに実装・設計するか
faithandbrave
2
1.1k
C++20からC++23までの変化
faithandbrave
9
12k
オープン化が進むC++の現状と展望
faithandbrave
19
11k
C++20 status
faithandbrave
0
950
Other Decks in Programming
See All in Programming
M5UnitUnified 最新動向 2025/05
gob
0
140
CursorとDevinが仲間!?AI駆動で新規プロダクト開発に挑んだ3ヶ月を振り返る / A Story of New Product Development with Cursor and Devin
rkaga
3
910
note の Elasticsearch 更新系を支える技術
tchov
9
3.6k
VitestのIn-Source Testingが便利
taro28
9
2.5k
データと事例で振り返るDevin導入の"リアル" / The Realities of Devin Reflected in Data and Case Studies
rkaga
3
2.1k
開発者フレンドリーで顧客も満足?Platformの秘密
algoartis
0
230
In geheimer Mission: AI Agents entwickeln
joergneumann
0
120
Cloudflare Workersで進めるリモートMCP活用
syumai
5
620
iOSアプリで測る!名古屋駅までの 方向と距離
ryunakayama
0
160
AIコーディングエージェントを 「使いこなす」ための実践知と現在地 in ログラス / How to Use AI Coding Agent in Loglass
rkaga
4
1.4k
エンジニアが挑む、限界までの越境
nealle
1
330
2025-04-25 GitHub Copilot Agent ライブデモ(スクリプト)
goataka
0
120
Featured
See All Featured
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
Building Applications with DynamoDB
mza
94
6.4k
Designing Experiences People Love
moore
142
24k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
47
2.7k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.7k
Why Our Code Smells
bkeepers
PRO
336
57k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
41
2.3k
Speed Design
sergeychernyshev
29
940
Build your cross-platform service in a week with App Engine
jlugia
231
18k
4 Signs Your Business is Dying
shpigford
183
22k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
48
5.4k
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