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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Akira Takahashi
February 09, 2024
Programming
1.3k
2
Share
使いたい標準C++機能がない環境でいかに実装・設計するか
Akira Takahashi
February 09, 2024
More Decks by Akira Takahashi
See All by Akira Takahashi
P2P通信の標準化 WebRTCを知ろう
faithandbrave
6
3.1k
C++20 射影変換
faithandbrave
0
790
C++26アップデート 2025-03
faithandbrave
0
2.2k
C++26 エラー性動作
faithandbrave
2
1.2k
C++20の整数
faithandbrave
0
280
コンテナと文字列の中間インタフェースspanとstring_view
faithandbrave
1
630
C++23 スタックトレースライブラリ
faithandbrave
0
620
if constexpr文はテンプレート世界のラムダ式である
faithandbrave
3
1.5k
C++20からC++23までの変化
faithandbrave
9
12k
Other Decks in Programming
See All in Programming
Symfony AI in Action - SymfonyLive Berlin 2026
chr_hertel
1
130
ふにゃっとしない名前の付け方 〜哲学で茹で上げる、コシのあるソフトウェア設計〜
shimomura
0
110
2026年のソフトウェア開発を考える(2026/05版) / Software Engineering Scrum Fest Niigata 2026 Edition
twada
PRO
22
12k
when storing skills in S3 file
watany
3
1.4k
cloudnative conference 2026 flyle
azihsoyn
0
150
ついに来た!本格的なマルチクラウド時代の Google Cloud
maroon1st
0
390
ハーネスエンジニアリングにどう向き合うか 〜ルールファイルを超えて開発プロセスを設計する〜 / How to approach harness engineering
rkaga
28
19k
t *testing.T は どこからやってくるの?
otakakot
1
920
属人化しないコード品質の作り方_2026.04.07.pdf
muraaano
0
330
20260514_its_the_context_window_stupid.pdf
heita
0
810
Are We Really Coding 10× Faster with AI?
kohzas
0
140
Making the RBS Parser Faster
soutaro
0
680
Featured
See All Featured
Testing 201, or: Great Expectations
jmmastey
46
8.1k
How to make the Groovebox
asonas
2
2.2k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
510
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
55k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Art, The Web, and Tiny UX
lynnandtonic
304
21k
Why Our Code Smells
bkeepers
PRO
340
58k
RailsConf 2023
tenderlove
30
1.4k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.9k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.1k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
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 {}; } }; }
·ͱΊ • $ ඪ४ϥΠϒϥϦͷػೳͰɺϢʔςΟϦςΟతͳͷ ࣮͍͢͠Ͱ͢ • ࣮ͯ͠Έͨܥͷهࣄੲ͔Βͨ͘͞Μ͋Δ • ඪ४ϥΠϒϥϦɺͱͯΑ͘ߟ͑ΒΕͨઃܭɾ࣮ͳͷͰɺ ֶͿ͜ͱͰ։ൃྗ্͕͠·͢
• ϦϦʔε͓ͯ͠ΘΓͰͳ͍ܧଓ։ൃͷݱ͕૿͑ͨͷͰɺ কདྷͷίϯύΠϥόʔδϣϯΞοϓఆͨ͠ઃܭ͕Ͱ͖Δͱ ͍͍Ͱ͢Ͷ