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
使いたい標準C++機能がない環境でいかに実装・設計するか
Search
Akira Takahashi
February 09, 2024
Programming
2
1.1k
使いたい標準C++機能がない環境でいかに実装・設計するか
Akira Takahashi
February 09, 2024
Tweet
Share
More Decks by Akira Takahashi
See All by Akira Takahashi
C++20 射影変換
faithandbrave
0
230
C++26アップデート 2025-03
faithandbrave
0
1.4k
C++26 エラー性動作
faithandbrave
2
1.1k
C++20の整数
faithandbrave
0
190
コンテナと文字列の中間インタフェースspanとstring_view
faithandbrave
1
500
C++23 スタックトレースライブラリ
faithandbrave
0
470
if constexpr文はテンプレート世界のラムダ式である
faithandbrave
3
1.2k
C++20からC++23までの変化
faithandbrave
9
12k
オープン化が進むC++の現状と展望
faithandbrave
19
11k
Other Decks in Programming
See All in Programming
Java on Azure で LangGraph!
kohei3110
0
110
人には人それぞれのサービス層がある
shimabox
3
670
The Evolution of Enterprise Java with Jakarta EE 11 and Beyond
ivargrimstad
1
610
コード書くの好きな人向けAIコーディング活用tips #orestudy
77web
3
300
Parallel::Pipesの紹介
skaji
2
910
Beyond Portability: Live Migration for Evolving WebAssembly Workloads
chikuwait
0
340
つよそうにふるまい、つよい成果を出すのなら、つよいのかもしれない
irof
1
280
GoのWebAssembly活用パターン紹介
syumai
3
9.9k
コードに語らせよう――自己ドキュメント化が内包する楽しさについて / Let the Code Speak
nrslib
6
1.4k
Cline指示通りに動かない? AI小説エージェントで学ぶ指示書の書き方と自動アップデートの仕組み
kamomeashizawa
1
420
JSAI2025 RecSysChallenge2024 優勝報告
unonao
1
450
「兵法」から見る質とスピード
ickx
0
260
Featured
See All Featured
YesSQL, Process and Tooling at Scale
rocio
172
14k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Agile that works and the tools we love
rasmusluckow
329
21k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
16
910
The Language of Interfaces
destraynor
158
25k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
14
1.5k
Bash Introduction
62gerente
614
210k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.8k
How GitHub (no longer) Works
holman
314
140k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
780
Transcript
͍͍ͨඪ४$ ػೳ͕ͳ͍ڥͰ ͍͔ʹ࣮ɾઃܭ͢Δ͔ ߴڮ থ "LJSB5BLBIBTIJ GBJUIBOECSBWF!HNBJMDPN 1SFGFSSFE/FUXPSLT *OD
ۚ $ .*9
։ൃݱͰΘΕ͍ͯΔ$ όʔδϣϯʁ • ॳ಄ͷݱࡏɺ։ൃݱͰΘΕ͍ͯΔ$ ͷόʔδϣ ϯͲΕͰ͠ΐ͏ʁ • ɺ#PPTUͰ$ ͷαϙʔτ͕ऴྃ͠·ͨ͠ •
$ $ Λ͍ͬͯΔέʔε͕ଟ͍͔͠Ε·ͤΜͶ
͍͍ͨඪ४ϥΠϒϥϦͷػೳ͕͍·͑ͳ͍ • ʮ$ ͷstd::optionalΛ͍͍͚ͨͲɺ ։ൃڥ$ ͳͷͰ͑ͳ͍ʯ • ͔͠͠ܧଓ։ൃͳͷͰ ϦϦʔε͓ͯ͠ΘΓͰͳ͍ ͍ͣΕί
ϯύΠϥΛόʔδϣϯΞοϓͯ͑͠ΔΑ͏ʹͳΔͣ • ͦΜͳํ͚ʹɺ • ඪ४ϥΠϒϥϦΛ࣮Ͱ͖ΔྗΛ͚ͭΑ͏ • ͍ͣΕඪ४ػೳʹࠩ͠ସ͑Δ͜ͱΛݟӽͨ͠ઃܭΛ͠Α͏ ͱ͍͏͓Λ͠Α͏ͱࢥ͍·͢
࣮ྫ࣌ؒͷ߹Ͱͻͱ͚ͭͩհ͠·͢ • $ ͷstd::optional • ࣮ํͱͯ͠ɺ • ϑϧ࣮Λࢦ͞ͳ͍ • ͏ػೳ͚࣮ͩ͢ΕΑ͍
$ TUEPQUJPOBMͱ • ༗ޮ͔ແޮͲͪΒ͔͕ೖΔܕ std::optional<int> opt; // optは無効値をもつ opt =
3; // 有効値を代入 if (opt) { // 有効値をもっているか判定 int r = opt.value(); // 有効値を取り出す } opt = std::nullopt; // 無効値を代入
PQUJPOBMͷ࣮ϙΠϯτͭ ແޮͱ͍͏ಛघͳঢ়ଶΛදݱ͢Δ ΉͩʹಈతϝϞϦ֬อΛ͠ͳ͍ • optionalͰnew malloc͠ͳ͍
ແޮͷදݱ • ۭͷܕ λάܕͱݴͬͨΓ͢Δ nullopt_tΛఆٛ͠ɺ ͦͷ །Ұͷ มͱͯ͠nulloptΛఆٛ͢Δ struct nullopt_t
{}; const nullopt_t nullopt{}; • PQUJPOBMΫϥεͰɺnullopt_tܕ͕ೖ͞ΕͨΒΛΫϦΞ͢Δ optional& operator=(nullopt_t) { reset(); return *this; } • ͜ΕλάσΟεύονͱݺΕΔख๏ͰɺΦʔόʔϩʔυղܾͷͨΊ͚ͩͷ ۭͷܕɾɺඪ४ϥΠϒϥϦ#PPTUͰͨ͘͞ΜΘΕ͍ͯΔ
ώʔϓΛΘͳ͍༗ޮͷදݱ • ༗ޮɾແޮͰ·͖ͬ͞ʹࢥ͍ͭ͘ͷϙΠϯλ T* p = new T(value); //
有効値を代入 … p = nullptr; // 無効値を代入 • ˛ • සൟʹ͏খ͞ͳϢʔςΟϦςΟͷͨΊʹ ಈతϝϞϦ֬อͨ͘͠ͳ͍
ώʔϓΛΘͳ͍༗ޮͷදݱ • ༗ޮͱϑϥάΛͯΑ͍ͷͰʁ T value; bool has_value; • ˛
• ༗ޮ͕ೖ͞Ε͍ͯͳ͍ͷʹɺܕ5ͷΦϒδΣΫτ͕࡞ΒΕΔͷ ආ͚͍ͨ
ώʔϓΛΘͳ͍༗ޮͷදݱ • ஔOFX QMBDFNFOUOFX ͢ΕΑ͍ͷͰʁ char value[sizeof(T)]; bool has_value;
// 有効値の代入 T* p = new (value) T(x); has_value = true; // 無効値の代入 p->~T(); has_value = false; • ̋ • $ ·Ͱ͜ΕͰΑ͔ͬͨɻ$ Ҏ߱ͬͱ͔ΜͨΜ
ώʔϓΛΘͳ͍༗ޮͷදݱ • ڞ༻ମΛ͓͏ union { T value; bool null_state;
}; bool has_value; • ˕ • Ͱ͖ͨɻ$ ͔Βڞ༻ମʹΫϥεΦϒδΣΫτΛೖΕΒΕΔ // 有効値の代入 new(&value) T{x}; has_value = true; // 無効値の代入 value.~T(); has_value = false;
ίʔυ #include <utility> #include <stdexcept> struct nullopt_t {}; const
nullopt_t nullopt{}; template <class T> class optional { union { T _value; bool _null_state = true; }; bool _has_value = false; public: optional(T&& x) : _has_value{true} { new (&_value) T{x}; }
ίʔυ optional& operator=(nullopt_t) { if (_has_value) { _has_value =
false; _value.~T(); } return *this; } explicit operator bool() const { return _has_value; } const T& value() const { if (_has_value) { return _value; } throw std::runtime_error("nullopt exception"); // 仮 } };
༻ྫ optional<int> opt = 3; if (opt) { std::cout <<
opt.value() << std::endl; } opt = nullopt; if (!opt) { std::cout << "nullopt" << std::endl; }
কདྷͷඪ४ػೳͱࠩ͠ସ͑ΒΕΔΑ͏ʹ͠Α͏ • std໊લۭؒʹࣗ࡞ػೳΛೖΕΔͷΑ͘ͳ͍ ߹ʹΑͬͯίϯύΠϧ ΤϥʔʹͳΔ ͷͰɺstdexͱ͔ͷ໊લۭؒʹೖΕΔ namespace stdex { struct
nullopt_t {}; template <class T> optional { … }; }
কདྷͷඪ४ػೳͱࠩ͠ସ͑ΒΕΔΑ͏ʹ͠Α͏ • ։ൃڥΛߋ৽ͯ͠optional͕͑ΔΑ͏ʹͳͬͨΒɺstdex໊લۭؒͰ std::optionalΛ͑ΔΑ͏ʹ͢Δ #include <optional> namespace stdex { using
nullopt_t = std::nullopt_t; template <class T> using optional = std::optional<T>; }
͜ͷઃܭ֎෦ϥΠϒϥϦʹ͑Δ • ֎෦ϥΠϒϥϦΛ͏ࡍʹɺμΠϨΫτʹΘͣࣗ࡞໊લۭؒΫϥεͰ ϥοϓ͓ͯ͘͠ͱɺଟ༷ͳڥʹରԠ͍ͤ͢͞ namespace ext { #if defined(__ios) using
Purchase = ios::Purchase; #elif defined(__android) using Purchase = android::Purchase; #endif } • ֎෦ϥΠϒϥϦΛ͏ࡍͷதؒϨΠϠʔΛ༻ҙ͠ɺͦ͜ͰڥࠩΛٵऩ͢ Δڞ௨ΠϯλϑΣʔεΛ࡞͓ͬͯ͘ͱɺ͋ͱ͋ͱϥΫ͕Ͱ͖Δ
શஔ͖͑Ͱͳ͘ϥοϓ͢ΔઃܭͰΑ͍ • ඪ४ϥΠϒϥϦͷΠϯλϑΣʔεʹറΒΕΔͱ࣮͕͍ͨΜͳ߹ • ࣗ࡞ΠϯλϑΣʔεͰ࡞ͬͯɺকདྷతʹඪ४ϥΠϒϥϦΛϥοϓͯ͠ ΠϯλϑΣʔεΛ߹ΘͤΔ͜ͱͰ͖Δ • ͜ͷํͩͱɺ֦ுػೳΛϝϯόؔͱͯ͠࡞Δ͜ͱͰ͖Δ UIFOͱ͔ namespace
stdext { template <class T> class Optional { public: Optional<R> then(F f) const { if (*this) return f(value()); return {}; } }; }
·ͱΊ • $ ඪ४ϥΠϒϥϦͷػೳͰɺϢʔςΟϦςΟతͳͷ ࣮͍͢͠Ͱ͢ • ࣮ͯ͠Έͨܥͷهࣄੲ͔Βͨ͘͞Μ͋Δ • ඪ४ϥΠϒϥϦɺͱͯΑ͘ߟ͑ΒΕͨઃܭɾ࣮ͳͷͰɺ ֶͿ͜ͱͰ։ൃྗ্͕͠·͢
• ϦϦʔε͓ͯ͠ΘΓͰͳ͍ܧଓ։ൃͷݱ͕૿͑ͨͷͰɺ কདྷͷίϯύΠϥόʔδϣϯΞοϓఆͨ͠ઃܭ͕Ͱ͖Δͱ ͍͍Ͱ͢Ͷ