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
1.3k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
使いたい標準C++機能がない環境でいかに実装・設計するか
Akira Takahashi
February 09, 2024
More Decks by Akira Takahashi
See All by Akira Takahashi
P2P通信の標準化 WebRTCを知ろう
faithandbrave
6
3.2k
C++20 射影変換
faithandbrave
0
860
C++26アップデート 2025-03
faithandbrave
0
2.2k
C++26 エラー性動作
faithandbrave
2
1.3k
C++20の整数
faithandbrave
0
300
コンテナと文字列の中間インタフェースspanとstring_view
faithandbrave
1
660
C++23 スタックトレースライブラリ
faithandbrave
0
640
if constexpr文はテンプレート世界のラムダ式である
faithandbrave
3
1.6k
C++20からC++23までの変化
faithandbrave
9
12k
Other Decks in Programming
See All in Programming
Webエンジニアなのにブラウザの仕組みがわからないので、Pythonで自作してみた
tatsuki12
4
1k
コンパウンドプロダクト開発のためのローカルプロセスマネージャー再発明 #layerxgo
izumin5210
0
180
いまどきの Codex で開発する visionOS アプリの開発スタイルについて
karad
0
160
引き算の組織 ― アウトカムとAIに全振りするために辞めたこと ― / Organization by Subtraction
hirokiyamamoto14
PRO
0
280
AIに既存システムを理解させる技術 ~レガシーを見捨てないハーネスエンジニアリング入門~
ochtum
0
140
Go を使い始めて 2 ヶ月の学び / My first two months with Go
contour_gara
0
370
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
270
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
2
360
メールのエイリアス機能を履き違えない
isshinfunada
0
250
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
570
typoなんかねぇよ
raspython3
0
470
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
170
Featured
See All Featured
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
RailsConf 2023
tenderlove
30
1.5k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
640
Making the Leap to Tech Lead
cromwellryan
135
10k
Bash Introduction
62gerente
615
220k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Designing Experiences People Love
moore
143
24k
YesSQL, Process and Tooling at Scale
rocio
174
15k
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
950
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
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 {}; } }; }
·ͱΊ • $ ඪ४ϥΠϒϥϦͷػೳͰɺϢʔςΟϦςΟతͳͷ ࣮͍͢͠Ͱ͢ • ࣮ͯ͠Έͨܥͷهࣄੲ͔Βͨ͘͞Μ͋Δ • ඪ४ϥΠϒϥϦɺͱͯΑ͘ߟ͑ΒΕͨઃܭɾ࣮ͳͷͰɺ ֶͿ͜ͱͰ։ൃྗ্͕͠·͢
• ϦϦʔε͓ͯ͠ΘΓͰͳ͍ܧଓ։ൃͷݱ͕૿͑ͨͷͰɺ কདྷͷίϯύΠϥόʔδϣϯΞοϓఆͨ͠ઃܭ͕Ͱ͖Δͱ ͍͍Ͱ͢Ͷ