Upgrade to Pro — share decks privately, control downloads, hide ads and more …

使いたい標準C++機能がない環境でいかに実装・設計するか

 使いたい標準C++機能がない環境でいかに実装・設計するか

Avatar for Akira Takahashi

Akira Takahashi

February 09, 2024
Tweet

More Decks by Akira Takahashi

Other Decks in Programming

Transcript

  1. ࢖͍͍ͨඪ४ϥΠϒϥϦͷػೳ͕͍·࢖͑ͳ͍ • ʮ$ ͷstd::optionalΛ࢖͍͍͚ͨͲɺ ։ൃ؀ڥ͸$ ͳͷͰ࢖͑ͳ͍ʯ • ͔͠͠ܧଓ։ൃͳͷͰ ϦϦʔε͓ͯ͠ΘΓͰ͸ͳ͍ ͍ͣΕί

    ϯύΠϥΛόʔδϣϯΞοϓͯ͠࢖͑ΔΑ͏ʹͳΔ͸ͣ • ͦΜͳํ޲͚ʹɺ • ඪ४ϥΠϒϥϦΛ࣮૷Ͱ͖ΔྗΛ͚ͭΑ͏ • ͍ͣΕඪ४ػೳʹࠩ͠ସ͑Δ͜ͱΛݟӽͨ͠ઃܭΛ͠Α͏ ͱ͍͏͓࿩Λ͠Α͏ͱࢥ͍·͢
  2. $ TUEPQUJPOBMͱ͸ • ༗ޮ஋͔ແޮ஋ͲͪΒ͔͕ೖΔܕ std::optional<int> opt; // optは無効値をもつ opt =

    3; // 有効値を代入 if (opt) { // 有効値をもっているか判定 int r = opt.value(); // 有効値を取り出す } opt = std::nullopt; // 無効値を代入
  3. ແޮ஋ͷදݱ • ۭͷܕ λάܕͱݴͬͨΓ΋͢Δ nullopt_tΛఆٛ͠ɺ ͦͷ །Ұͷ ม਺ͱͯ͠nulloptΛఆٛ͢Δ struct nullopt_t

    {}; const nullopt_t nullopt{}; • PQUJPOBMΫϥεͰ͸ɺnullopt_tܕ͕୅ೖ͞ΕͨΒ஋ΛΫϦΞ͢Δ optional& operator=(nullopt_t) { reset(); return *this; } • ͜ΕλάσΟεύονͱݺ͹ΕΔख๏ͰɺΦʔόʔϩʔυղܾͷͨΊ͚ͩͷ ۭͷܕɾ஋͸ɺඪ४ϥΠϒϥϦ΍#PPTUͰͨ͘͞Μ࢖ΘΕ͍ͯΔ
  4. ώʔϓΛ࢖Θͳ͍༗ޮ஋ͷදݱ  • ༗ޮ஋ɾແޮ஋Ͱ·͖ͬ͞ʹࢥ͍ͭ͘ͷ͸ϙΠϯλ T* p = new T(value); //

    有効値を代入 … p = nullptr; // 無効値を代入 • ˛ • සൟʹ࢖͏খ͞ͳϢʔςΟϦςΟͷͨΊʹ ಈతϝϞϦ֬อ͸ͨ͘͠ͳ͍
  5. ώʔϓΛ࢖Θͳ͍༗ޮ஋ͷදݱ  • ༗ޮ஋ͱϑϥάΛ΋ͯ͹Α͍ͷͰ͸ʁ T value; bool has_value; • ˛

    • ༗ޮ஋͕୅ೖ͞Ε͍ͯͳ͍ͷʹɺܕ5ͷΦϒδΣΫτ͕࡞ΒΕΔͷ ͸ආ͚͍ͨ
  6. ώʔϓΛ࢖Θͳ͍༗ޮ஋ͷදݱ  • ഑ஔOFX QMBDFNFOUOFX ͢Ε͹Α͍ͷͰ͸ʁ char value[sizeof(T)]; bool has_value;

    // 有効値の代入 T* p = new (value) T(x); has_value = true; // 無効値の代入 p->~T(); has_value = false; • ̋ • $ ·Ͱ͸͜ΕͰΑ͔ͬͨɻ$ Ҏ߱͸΋ͬͱ͔ΜͨΜ
  7. ώʔϓΛ࢖Θͳ͍༗ޮ஋ͷදݱ  • ڞ༻ମΛ࢖͓͏ union { T value; bool null_state;

    }; bool has_value; • ˕ • Ͱ͖ͨɻ$ ͔Β͸ڞ༻ମʹΫϥεΦϒδΣΫτΛೖΕΒΕΔ // 有効値の代入 new(&value) T{x}; has_value = true; // 無効値の代入 value.~T(); has_value = false;
  8. ׬੒ίʔυ  #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}; }
  9. ׬੒ίʔυ  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"); // 仮 } };
  10. ࢖༻ྫ optional<int> opt = 3; if (opt) { std::cout <<

    opt.value() << std::endl; } opt = nullopt; if (!opt) { std::cout << "nullopt" << std::endl; }
  11. ͜ͷઃܭ͸֎෦ϥΠϒϥϦʹ΋࢖͑Δ • ֎෦ϥΠϒϥϦΛ࢖͏ࡍʹɺμΠϨΫτʹ࢖Θͣࣗ࡞໊લۭؒ΍ΫϥεͰ ϥοϓ͓ͯ͘͠ͱɺଟ༷ͳ؀ڥʹରԠͤ͞΍͍͢ namespace ext { #if defined(__ios) using

    Purchase = ios::Purchase; #elif defined(__android) using Purchase = android::Purchase; #endif } • ֎෦ϥΠϒϥϦΛ࢖͏ࡍͷதؒϨΠϠʔΛ༻ҙ͠ɺͦ͜Ͱ؀ڥࠩΛٵऩ͢ Δڞ௨ΠϯλϑΣʔεΛ࡞͓ͬͯ͘ͱɺ͋ͱ͋ͱϥΫ͕Ͱ͖Δ
OSZAR »