æ¥åžžã®ã³ãŒãã«åœ±é¿ãäžãã8ã€ã®äŸ¿å©ãªå€æŽã«ã€ããŠèª¬æããŸãã 4ã€ã®å€æŽã¯èšèªèªäœã«é¢ä¿ããããã«4ã€-æšæºã©ã€ãã©ãªã«é¢ä¿ããŸãã
ãã¹ãŠã®C ++éçºè
ã䜿çšãã¹ã10ã®C ++ 11æ©èœã®èšäºã«ãèå³ããããããããŸããã
è¬èŸ
ãã·ã¢ã®C ++ãŠãŒã¶ãŒã°ã«ãŒãäŒè°ã§ã®ã¬ããŒãããããã€ãã®äŸãåãäžããŸããããã®ããã®ãªãŒã¬ãã€ã¶ãŒãšã¹ããŒã«ãŒã«æè¬ããŸãã ç§ã¯äŸãæããŸããïŒ
1.å®£èšæã®åè§£ïŒengãæ§é ãã€ã³ãã£ã³ã°ïŒ
- 倿°ã宣èšãããšãã«åè§£ã䜿çšããŸãïŒauto [aãbãc] = std :: tupleïŒ32ã "hello" sã13.9ïŒ
- ãã©ã¡ãŒã¿ãå²ãåœãŠã代ããã«ã颿°ããæ§é äœãŸãã¯ã¿ãã«ãè¿ããŸã
æ°ããæ§æã䜿çšããŠã std::pair
ã std::tuple
ããã³æ§é äœãåè§£ãããšäŸ¿å©ã§ãã
#include <string> struct BookInfo { std::string title; // In UTF-8 int yearPublished = 0; }; BookInfo readBookInfo(); int main() { // title year, auto [title, year] = readBookInfo(); }
C ++ 17ã§ã¯ãå®£èšæã®åè§£ã«å¶éããããŸãã
- åè§£å¯èœãªèŠçŽ ã®ã¿ã€ãã¯æç€ºçã«æå®ã§ããŸãã
auto [title, [header, content]] = ...
ãšãã圢åŒã®ãã¹ããããåè§£ã¯äœ¿çšã§ããŸããauto [title, [header, content]] = ...
å®£èšæã®åè§£ã¯ãååãšããŠãä»»æã®ã¯ã©ã¹ãåè§£ããããšãã§ããŸãtuple_element
ã tuple_size
ãããã³get
ç¹æ®tuple_element
ããããšã«ããããã³ããäžåºŠæžãã ãget
ã 詳现ã«ã€ããŠã¯ã ã¯ã©ã¹ãžã®C ++ 17æ§é åãã€ã³ãã£ã³ã°ãµããŒãã®è¿œå ïŒblog.tartanllama.xyzïŒã®èšäºãåç
§ããŠãã ããã
å®£èšæã®åè§£ã¯ã std::map<>
ããã³std::unordered_map<>
ã³ã³ããã§ãå€ã.insert()
ã¡ãœãããš2ã€ã®æ°ããã¡ãœããã§.insert()
ãŸãã
- try_emplaceã¡ãœããã¯ãæå®ãããããŒããŸã ã³ã³ããã«ãªãå Žåã«ã®ã¿æ¿å
¥ããŸã
- æå®ãããããŒãæ¢ã«ã³ã³ããå
ã«ããå Žåãäœãèµ·ãããŸãããç¹ã«ãå³èŸºå€ã¯ç§»åããŸãã
- insert_or_assignã¡ãœããã¯ãæ¢åã®èŠçŽ ã«å€ãæ¿å
¥ãŸãã¯å²ãåœãŠãŸã
try_emplaceã䜿çšããåè§£ã®äŸãšãããããæšªæãããšãã®ããŒå€åè§£ïŒ
#include <string> #include <map> #include <cassert> #include <iostream> int main() { std::map<std::string, std::string> map; auto [iterator1, succeed1] = map.try_emplace("key", "abc"); auto [iterator2, succeed2] = map.try_emplace("key", "cde"); auto [iterator3, succeed3] = map.try_emplace("another_key", "cde"); assert(succeed1); assert(!succeed2); assert(succeed3); // key value range-based for for (auto&& [key, value] : map) { std::cout << key << ": " << value << "\n"; } }
2.ãã³ãã¬ãŒããã©ã¡ãŒã¿ã®èªååºå
äž»ãªã«ãŒã«ïŒ
std::make_pair
ãšãã圢åŒã®é¢æ°std::make_pair
äžèŠã«ãªããŸããstd::make_pair
std::pair{10, "hello"s}
åŒãèªç±ã«èšè¿°ããŠãã ãããã³ã³ãã€ã©ã¯åãæšæž¬ããŸãstd::lock_guard<std::mutex> guard(mutex);
ãšãã圢åŒã®ãã³ãã¬ãŒãRAII çããªããŸãïŒ std::lock_guard guard(mutex);
- 颿°
std::make_unique
ããã³std::make_shared
ã¯ãŸã å¿
èŠã§ã
ãã³ãã¬ãŒããã©ã¡ãŒã¿ãèªåçã«è¡šç€ºããããã®ç¬èªã®ãã³ããäœæã§ããŸãïŒ Automatic_deduction_guidesãåç
§ããŠãã ãã
è峿·±ãæ©èœïŒ initializer_list<>
ã³ã³ã¹ãã©ã¯ã¿ãŒinitializer_list<>
ã1ã€ã®èŠçŽ ã®ãªã¹ãã§initializer_list<>
ã¹ããããããŸãã äžéšã®JSONã©ã€ãã©ãªïŒjson_spiritãªã©ïŒã®å Žåãããã¯èŽåœçã§ãã ååž°åãšSTLã³ã³ãããŒã䜿çšããªãã§ãã ããïŒ
#include <vector> #include <type_traits> #include <cassert> int main() { std::vector v{std::vector{1, 2}}; // vector<int>, vector<vector<int>> static_assert(std::is_same_v<std::vector<int>, decltype(v)>); // assert(v.size() == 2); }
3.ãã¹ããããåå空éã®å®£èš
åå空éã®ãã¹ããåé¿ããåé¿ããªãå Žåã¯ã次ã®ããã«å®£èšããŸãã
namespace product::account::details {
4.屿§nodiscardãfallthroughãmaybe_unused
äž»ãªã«ãŒã«ïŒ
[[fallthrough]]
屿§ãŸãã¯break;
ã¹ããŒãã¡ã³ãã®ããããã§æåŸãé€ããã¹ãŠã®caseãããã¯ãå®äºãbreak;
- ãšã©ãŒã³ãŒããè¿ã颿°ãŸãã¯ãã€ã³ã¿ãŒãææãã颿°ã«
[[nodiscard]]
ã䜿çšããŸãïŒã¹ããŒããã©ããã«é¢ä¿ãªãïŒ - assertã§ã®æ€èšŒã«ã®ã¿å¿
èŠãªå€æ°ã«
[[maybe_unused]]
ã䜿çšããŸã
屿§ã®è©³çްã«ã€ããŠã¯ãèšäºãC ++ 17ã®å±æ§ã䜿çšããæ¹æ³ããåç
§ããŠãã ããã ããã«çãæç²ããããŸãã
C ++ã§ã¯ãswitchæ§é äœã®åã±ãŒã¹ã®åŸã«ãã¬ãŒã¯ã远å ããå¿
èŠããããããã¯çµéšè±å¯ãªéçºè
ã«ãšã£ãŠãå¿ããã¡ã§ãã ãã©ãŒã«ã¹ã«ãŒå±æ§ã¯ã空ã®åœä»€ã«æ¥çã§ããæå©ã«æ¥ãŸãã å®éã屿§ã¯ç©ºã®ã¹ããŒãã¡ã³ãã«ç¶ãã±ãŒã¹ã«æ¥çãããŠããŸãã
enum class option { A, B, C }; void choice(option value) { switch (value) { case option::A:
ãã®å±æ§ãå©çšããã«ã¯ãGCCããã³Clangã«-Wimplicit-fallthrough
èŠåãå«ããå¿
èŠããããŸãã ãã®ãªãã·ã§ã³ãæå¹ã«ãããšããã©ãŒã«ã¹ã«ãŒå±æ§ãæããªãåã±ãŒã¹ã§èŠåãçæãããŸãã
ããã©ãŒãã³ã¹èŠä»¶ã®é«ããããžã§ã¯ãã§ã¯ãïŒå°ãªããšãäžéšã®ã³ã³ããŒãã³ãã§ã¯ïŒäŸå€ãã¹ããŒããªãããšãå®è·µã§ããŸãã ãã®ãããªå Žåãæäœãšã©ãŒã¯ã颿°ããè¿ãããæ»ãã³ãŒãã«ãã£ãŠå ±åãããŸãã ãã ãããã®ã³ãŒãããã§ãã¯ããã®ãå¿ããããšã¯éåžžã«ç°¡åã§ãã
[[nodiscard]] std::unique_ptr<Bitmap> LoadArrowBitmap() { } void foo() {
ããšãã°ããšã©ãŒã¯ã©ã¹ã䜿çšããå Žåã宣èšã§å±æ§ã1åæå®ã§ããŸãã
class [[nodiscard]] error_code { }; error_code bar(); void foo() {
ããã°ã©ããŒã¯ãåŒã³åºããã颿°ã®ãšã©ãŒã³ãŒããæ ŒçŽããããã«ããããã°ããŒãžã§ã³ã§ã®ã¿äœ¿çšããã倿°ãäœæããããšããããŸãã ããããããã¯åãªãã³ãŒãèšèšãšã©ãŒã§ãããæ»ãå€ã¯åžžã«åŠçããå¿
èŠããããŸãã ãã ãïŒ
5.æååãã©ã¡ãŒã¿ãŒã®string_viewã¯ã©ã¹
ã«ãŒã«ïŒ
const string&
代ããã«ãã¹ãŠã®é¢æ°ãšã¡ãœããã®ãã©ã¡ãŒã¿ãŒã§const string&
å€ã«ãã£ãŠéææstring_view
ãååŸããã
- 以åã®ããã«
string
ææãã颿°ããã³ã¡ãœããããæ»ã
- 颿°ããstring_viewãè¿ããšãã¯æ³šæããŠãã ããïŒããã«ãããã¶ãäžãããªã³ã¯ã®åé¡ïŒã¶ãäžãããã€ã³ã¿ïŒãçºçããå¯èœæ§ããããŸã
string_viewããã©ã¡ãŒã¿ãŒã«ã®ã¿æé©ã«äœ¿çšãããçç±ã®è©³çްã«ã€ããŠã¯ãèšäºstd :: string_viewã¯æååã®äžæã€ã³ã¹ã¿ã³ã¹ããæ§ç¯ãããèšäºãåç
§ããŠãã ããã
string_view
ã¯ã©ã¹string_view
ã远å ã®ã¡ã¢ãªå²ãåœãŠãªãã§std::string
ãšconst char*
äž¡æ¹ããç°¡åã«æ§ç¯ã§ãããšããç¹ã§åªããŠããŸãã constexprã®ãµããŒãããããstd :: stringã€ã³ã¿ãŒãã§ã€ã¹ãç¹°ãè¿ããŸãã ãã ãããã€ãã¹ããããŸãstring_view
ãæ«å°Ÿã«ãã«æåãååšstring_view
ããšã¯ä¿èšŒãããŸããã
6.ãªãã·ã§ã³ã®ã¯ã©ã¹ãšããªã¢ã³ã
optional<>
ããã³variant<>
éåžžã«åºãããããã®èšäºã§ã¯ããããå®å
šã«èª¬æããããšã¯ããŸããã äž»ãªã«ãŒã«ïŒ
- ææè
ã®åç¶æéãããçãåç¶æéãæã€ãªããžã§ã¯ãTãäœæããããã«ã
unique_ptr<T>
optional<T>
ã§ã¯ãªãoptional<T>
奜ã
- Implå®çŸ©ã¯ã¯ã©ã¹å®è£
ãã¡ã€ã«ã«é ãããŠãããããPIMPLã®å Žåã¯
unique_ptr<Impl>
䜿çšããŸã
- ã©ã€ã»ã³ã¹ç¶æ
ãªã©ã®ç¶æ
ããåç¶æ
ã«è¿œå ããŒã¿ãååšããããã«åæå®æ°ã§èšè¿°ã§ããªãç¶æ³ã§ã¯ãenumãŸãã¯polymorphicã¯ã©ã¹ã®ä»£ããã«ããªã¢ã³ãåã䜿çšããŸã
- äŸå€ã®ãšã©ãŒã³ãŒããªã©ã®ããŒã¿ããã¹ãŠã®ããªã¢ã³ãã§åŠçããå¿
èŠããããããªã¢ã³ãã®äžå®å
šãªåŠçã§ã³ã³ãã€ã«ãšã©ãŒãçºçããå Žåã¯ãenumã§ã¯ãªãããªã¢ã³ãã¿ã€ãã䜿çšããŸã
- å¯èœãªéã代ããã«ããªã¢ã³ãã䜿çšãã
- optionalã¯ã寿åœãææè
ã®å¯¿åœããçããªããžã§ã¯ããäœæããããã«äœ¿çšã§ããŸã
- ãšã©ãŒåŠçã«
optional
ã䜿çšããªãã§ãã ããããšã©ãŒæ
å ±ã¯å«ãŸããŸããã
- å€ãŸãã¯ãšã©ãŒãè¿ãã«ã¯ã
boost::variant<...>
åºã¥ããŠç¬èªã®ã¯ã©ã¹Expected<Value, Error>
ãèšè¿°ã§ããŸã - ãã ãã宿ãããã®ãäœæããŠååŸããããšã¯ã§ããŸããïŒ github.com/martinmoene/expected-lite
ãªãã·ã§ã³ã®ãµã³ãã«ã³ãŒãïŒ
- ãªãã·ã§ã³ã«ã¯ã
operator*
ãšoperator->
ãããã³äŸ¿å©ãªã¡ãœãã.value_or(const T &defaultValue)
- optionalã«ã¯valueã¡ãœãããããã
operator*
ãšã¯ç°ãªããå€ããªãå Žåã«äŸå€std::bad_optional_access
ã¹ããŒããŸã - ãªãã·ã§ã³ã«ã¯æ¯èŒæŒç®åã==ãããïŒ=ããã<ããã<=ããã>ããã> =ãããããŸããã
std::nullopt
æå¹ãªå€ããå°ãã - ãªãã·ã§ã³ã«ã¯boolãžã®æç€ºçãªå€ææŒç®åããããŸã
ããªã¢ã³ããå«ããµã³ãã«ã³ãŒãïŒããã§ã¯ãããªã¢ã³ããç°ãªãç¶æ
ã«ç°ãªãããŒã¿ãæã£ãŠããå Žåã«ãããã€ãã®ç¶æ
ã®1ã€ãä¿åããããã«ããªã¢ã³ãã䜿çš
struct AnonymousUserState { }; struct TrialUserState { std::string userId; std::string username; }; struct SubscribedUserState { std::string userId; std::string username; Timestamp expirationDate; LicenseType licenceType; }; using UserState = std::variant< AnonymousUserState, TrialUserState, SubscribedUserState >;
ã¡ã¢ãªç®¡çãžã®ã¢ãããŒãã«ãããããªã¢ã³ãã®å©ç¹ïŒããŒã¿ã¯ã远å ã®ã¡ã¢ãªå²ãåœãŠãªãã§ããªã¢ã³ãåã®å€ãã£ãŒã«ãã«æ ŒçŽãããŸãã ããã«ãããããªã¢ã³ãåã®ãµã€ãºã¯ããã®æ§æã«å«ãŸããåã«äŸåããŸãã ããã¯ã32ãããããã»ããµäžã®ãµã€ãºããŒãã«ã®ããã«èŠããå ŽåããããŸãïŒãã ããããã¯äžæ£ç¢ºã§ãïŒã

7.颿°std :: sizeãstd :: dataãstd :: beginãstd :: endã䜿çšããŸã
- std :: sizeã䜿çšããŠãCã¹ã¿ã€ã«ã®é
åã®é·ããæž¬å®ããŸã
- ãã®é¢æ°ã¯é
åããã³STLã³ã³ããã§åäœããŸãããéåžžã®ãã€ã³ã¿ãæž¡ãããšãããšã³ã³ãã€ã«ãšã©ãŒãã¹ããŒãããŸã
- std :: dataã䜿çšããŠãæååãé
åããŸãã¯
std::vector<>
ã®å
é ãžã®å€æ°ãã€ã³ã¿ãŒãååŸããŸã
- 以åãåŒ
&text[0]
ãã®ãããªãã€ã³ã¿ãŒãååŸãããã&text[0]
䜿çšãããŸãããã空ã®è¡ã§ã¯æªå®çŸ©ã®åäœããããŸã
ãã€ããæäœããããã«GSLã©ã€ãã©ãªïŒC ++ã³ã¢ã¬ã€ãã©ã€ã³ãµããŒãã©ã€ãã©ãªïŒã«äŸåããæ¹ãè¯ãå ŽåããããŸãã
8. std ::ãã¡ã€ã«ã·ã¹ãã ã䜿çšãã
äž»ãªã«ãŒã«ïŒ
- ãã¹ãæå³ãããã¹ãŠã®ãã©ã¡ãŒã¿ãŒã®æååã®ä»£ããã«ã
std::filesystem::path
æž¡ããŸã canonical
颿°ã«æ³šæããŠãã ããïŒããããlexically_normalã¡ãœãããæå³ããŸã
- canonicalã¯ã·ã³ããªãã¯ãªã³ã¯ãåŠçããŸãããlexically_normalã¯åŠçããŸãã
- canonicalã¯ãã¹ãååšããããšãèŠæ±ããŸãããlexically_normalã¯ååšããŸãã
- Windowsã§ã¯ãã»ãŒé·ããããã¹ãšã..ãã貌ãä»ããŠãããæšæºãé©çšããããšãããšå€±æããå ŽåããããŸãããã¡ã€ã«ãžã®ãã¹ãé·ããããããBoostã¯äŸå€ãã¹ããŒããŸã
relative
颿°ã«æ³šæããŠãã ããïŒããããlexically_relative- ãšã©ãŒã蚱容ã§ããå Žåã¯ãnoexceptããŒãžã§ã³ã®é¢æ°ïŒãšã©ãŒã³ãŒãä»ãïŒã䜿çšããŠãã ããã
- ããšãã°ã exists颿°ã®noexceptããŒãžã§ã³ã䜿çšãããšãäžéšã®ãããã¯ãŒã¯ãã¹ã§äŸå€ãçºçããŸãïŒ
- ããŒã¹ãã䜿çšããªã::ãã¡ã€ã«ã·ã¹ãã
Bad Boost ::ãã¡ã€ã«ã·ã¹ãã ãšã¯äœã§ããïŒ åœŒã«ã¯ããã€ãã®èšèšäžã®åé¡ãããããšãããããŸããïŒ
- Boostã¯2038åé¡ã解決ããŠããŸããã ããæ£ç¢ºã«ã¯ããã®ã¿ã¹ã¯ã¯time_tã«è»¢éãããŸããããLinuxã§ã¯ãŸã 32ãããã§ãïŒ
- ãã¡ã€ã«ã·ã¹ãã ã®STLããŒãžã§ã³ã«ã¯ããšã³ã³ãŒãã£ã³ã°ãæäœããããã®ãã¹ãŠã®ããŒã«ããããŸã
çµéšã®ããããã°ã©ããªã誰ã§ããWindowsã·ã¹ãã ãšUNIXã·ã¹ãã ã®ãã¹åŠçã®éããèªèããŠããŸãã
- Windowsã§ã¯ããã¹ã¯UTF-16æååãšããŠåãå
¥ããããŸãïŒãŸãã¯UCS-2æååãã€ãŸããã¹ã®ãµãã²ãŒããã¢ã¯é¿ããŠãã ããïŒïŒããã䜿çšãããã¿ã€ãwchar_tã¯UTF-16ã§ãšã³ã³ãŒãããã2ãã€ãæåã衚ãããã¹ã»ãã¬ãŒã¿ãšããŠæ©èœããŸãããã¯ã¹ã©ãã·ã¥ã\ã
- UNIXã§ã¯ããã¹ã¯UTF-8è¡ãšããŠåãå
¥ãããããã£ãã«äœ¿çšãããªãwchar_tã¯UCS32ã§ãšã³ã³ãŒãããã4ãã€ãæåã衚ããã¹ã©ãã·ã¥ã/ãã¯ãã¹åºåãæåã§ã
ãã¡ããããã¡ã€ã«ã·ã¹ãã ã¯ãã®ãããªéãããæœè±¡åãããã©ãããã©ãŒã åºæã®æååãšãŠãããŒãµã«UTF-8ã®äž¡æ¹ãç°¡åã«æäœã§ããããã«ããŸãã
- ãã¹ã®UTF-8ããŒãžã§ã³ãååŸããã«ã¯ã u8stringã¡ãœããã䜿çšããŸã
- UTF-8æååãããã¹ãæ§ç¯ããã«ã¯ãç¡æã®u8path颿°ã䜿çšããŸã
std::string
ããã®std::filesystem::path
ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããªãã§ãã ãã-Windowsã§ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã¯OSã®ãšã³ã³ãŒãã£ã³ã°ãå
¥åãšã³ã³ãŒãã£ã³ã°ãšèŠãªããŸãïŒ
ããŒãã¹ã«ãŒã«ïŒã¯ã©ã³ããint_to_stringããã³string_to_intã®åäœæã忢
std :: clamp颿°ã¯ãminããã³max颿°ãè£å®ããŸãã äžãšäžã®äž¡æ¹ã®æå³ãåãæšãŠãŸãã åæ§ã®boost::clamp
æ©èœã¯ãC ++ã®ä»¥åã®ããŒãžã§ã³ã§äœ¿çšã§ããŸãã
ãã¯ã©ã³ããåçºæããªããã«ãŒã«ã¯äžè¬åã§ããŸããå€§èŠæš¡ãªãããžã§ã¯ãã§ã¯ãäžžããå€ã®ããªãã³ã°ãªã©ã®ããã«å°ããªé¢æ°ãåŒãéè€ãããªãã§ãã ããã -ãããã©ã€ãã©ãªã«äžåºŠè¿œå ããã ãã§ãã
åæ§ã®ã«ãŒã«ã¯ãæåååŠçã¿ã¹ã¯ã«å¯ŸããŠæ©èœããŸãã æååãšè§£æã®ããã®ç¬èªã®å°ããªã©ã€ãã©ãªãæã£ãŠããŸããïŒ è§£æãŸãã¯æ°å€ã®æžåŒèšå®ã¯ãããŸããïŒ ãã®å Žåãå®è£
ãto_charsããã³from_charsåŒã³åºãã«çœ®ãæããŸã
to_chars
ããã³from_chars
ãšã©ãŒåŠçããµããŒãããŸãã æ¬¡ã®2ã€ã®å€ãè¿ããŸãã
- æåã®åã¯ãããã
char*
ãŸãã¯const char*
ãããåŠçã§ããªãã£ãæåã®ã³ãŒãåäœïŒã€ãŸããcharãŸãã¯wchar_tïŒãæããŸã - 2çªç®ã¯
std::error_code
åã§ãããstd :: system_erroräŸå€ã®ã¹ããŒã«é©ãã詳现ãªãšã©ãŒæ
å ±ãå ±åããŸã
ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã§ã¯ãšã©ãŒã«å¯Ÿããåå¿ã®æ¹æ³ãç°ãªãå Žåããããããã©ã€ãã©ãªãšãŠãŒãã£ãªãã£ã¯ã©ã¹å
ã§to_charsããã³from_charsãåŒã³åºãå¿
èŠããããŸãã
#include <utility> // , 0 // ( atoi, ) template<class T> T atoi_17(std::string_view str) { T res{}; std::from_chars(str.data(), str.data() + str.size(), res); return res; }