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

if constexpr文はテンプレート世界のラムダ式である

if constexpr文はテンプレート世界のラムダ式である

Akira Takahashi

April 19, 2024
Tweet

More Decks by Akira Takahashi

Other Decks in Programming

Transcript

  1. ࣗݾ঺հ • 1SFGFSSFE/FUXPSLTࣾͰɺεʔύʔίϯϐϡʔλ./$PSF ͷιϑτ΢ΣΞΛ࡞͍ͬͯ·͢ • ΤϛϡϨʔλͱ͔Ξηϯϒϥͱ͔ͷ௿ϨΠϠʔͳ΋ͷΛ࡞ͬͯ·͢ • ೔ຊͷ$ ඪ४ԽҕһձʹҰ࣌ظࢀՃ͍ͯ͠·ͨ͠ •

    $ ͷ೔ຊޠϦϑΝϨϯεαΠτDQQSFGKQΛ࡞͍ͬͯ·͢ • ஶॻ • ʰ$ ςϯϓϨʔτςΫχοΫʱ • ʰ$ ϙέοτϦϑΝϨϯεʱ • ʰϓϩάϥϛϯάͷຐಋॻʱ • ࠓ೥͸$ ͷೖ໳αΠτΛ࡞Γ͍ͨ
  2. $ ରԠͷ$ ϙέϦ׬੒͠·ͨ͠ • ೥ʹ$ ൛Λग़൛ͯ͠ɺ վగΛ೥ଓ͚͍ͯ·͢ • ʮ΍Γ͍ͨ͜ͱʯ͔ΒʮͲ͏΍ͬͯʯ Λௐ΂ΔٯҾ͖ϦϑΝϨϯε

    • DQQSFGKQͱ͸໾ׂ͕ҟͳΔ • ষཱͯ΍આ໌ͷཻ౓͸ ݴޠɾஶऀ͝ͱʹ͕ͪ͏ • $ ϙέϦ͸ɺදࢴͷΧδϡΞϧ͞ͱ ͕ͪͬͯɺॻ͖͗͢ͳ͘Β͍આ໌Λ ॻ͍͍ͯΔ
  3. ৘ใൃ৴Λ͠Α͏ • ఻ঝ͞Εͳ͍ٕज़͸ഇΕ͍ͯ͘ • ຊΛॻ͘ਓ͕૿͑ͯ΄͍͠ • ຊͰҰ൪͍ͨ΁Μͳͷ͸ɺॻ্͖͛Δ͜ͱ • ్தͰ౤͛ग़ͣ͞ɺ࠷ޙ·Ͱ࡞Γ্͛Δͷ͕Ұ൪͍ͩ͡ •

    ୯ൃهࣄͱ͕ͪͬͯɺຊ͸ • Ұ؏ੑ͋Δํ਑ͷ΋ͱɺ • ମܥతͳղઆΛఏڙ͠ɺ • ϨϏϡʔʹଟ͘ͷ࣌ؒΛ͔͚Δ ग़൛ޙʹमਖ਼͕Ͱ͖ͳ͍ ͜ͱ͕େ͖ͳՁ஋ • ग़൛ࣾͱͷڮ౉͠΍ϨϏϡʔͳͲڠྗ͠·͢
  4. $ ͰೖͬͨJGDPOTUFYQSจͷ͓࿩Ͱ͢ if constexpr (std::is_same_v<T, int>) { // intに関する処理… }

    else { // それ以外の型の処理… } • JGDPOTUFYQSจ͸ɺίϯύΠϧ࣌৚݅ʹΑΔ৚݅෼ذͰ͢ • ֘౰͠ͳ͔ͬͨํͷ෼ذίʔυ͸ɺόΠφϦʹؚ·Ε·ͤΜ
  5. ڬΈࠐΈ͍ͨͪΐͬͱͨ͠ॲཧ template <class T> void f() { if constexpr (typeid(T)

    == typeid(int)) { // …前処理… } // …共通の処理… } • ͨͱ͑͹લॲཧ • ͜ΕΛΦʔόʔϩʔυͰ΍Ζ͏ͱ͢Δͱ • ؔ਺಺ͷม਺Λ౉ͨ͠Γ͕ΊΜͲ͏ • ίʔυ͕ࢄΒ͹Δ
  6. ΦʔόʔϩʔυͷΊΜͲ͏͞Λߟ͑Δ void f_impl(int x, double a, std::string b) { //

    …intに対する処理… } template <class T> void f_impl(T, double, std::string) { // …それ以外の型ではなにもしない… } • ಛఆͷܕҎ֎ʹର͢Δۭͷؔ਺Λఆٛ͢Δඞཁ͕͋Δ • Ҿ਺౉͠ͷίετ Ϝʔϒͱ͔EFDMWBMͱ͔ Λ·͡Ίʹߟ͑Δ ඞཁ͕͋Δ
  7. ྫɿ΄ͱΜͲಉ͡ྻڍࢠΛ΋ͭྻڍܕͷϋϯυϦϯά enum class A { a, b }; enum class

    B { a, b, c }; template <class E> string enum_to_string(E e) { if constexpr (requires{ E::c; }) { if (e == E::c) return "c"; } switch (e) { …a, bの文字列化… } } • จࣈྻԽ͚ͩͰͳ͘ɺྻڍࢠΛܕʹม׵ɾରԠͤ͞Δ৔໘Ͱ΋ ࢖͑Δ
  8. JGDPOTUFYQSͷͦͷଞͷ࿩ • $ ن֨తʹ͸ʮDPOTUFYQS JGTUBUFNFOUʯͱ͍͏໊শͰ ʮJGDPOTUFYQS ৚݅ࣜ ʯ͕ೖ͍ͬͯΔ • ߏจͷ౎߹

    • DPOTUFYQS JG ৚݅ࣜ ͩͱFMTFͷํ΋DPOTUFYQS FMTFʹͳͬͯ͠·͏ • ͜͜Ͱ͸ػೳ໊ͱͯ͠JGDPOTUFYQSΛݴͬͯ·͢ • %ݴޠͰTUBUJDJGจͱ͍͏ͷ͕͋ΓɺͦͪΒ͸είʔϓΛੜ੒͠ ͳ͍ͷͰศར • ܕͷఆٛΛ෼ذͨ͠Γɺ৚݅͝ͱʹڞ௨ͷม਺Λ࡞ΕͨΓʜ • JGDPOTUFYQS ৚݅ࣜ \JOUYʜ^FMTF\5Yʜ^ G Y