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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

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

Avatar for Akira Takahashi

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