Slide 1

Slide 1 text

#PPTU7BSJBOUUJQT 5XJUUFS!-JOEB@QQ (JUIVC!SIZTE

Slide 2

Slide 2 text

CPPTUWBSJBOUͱ͸ w ܕ҆શͳڞ༻ମʢVOJPOʣ w /FWFSFNQUZHVBSBOUFF ! ! ! ! ! w IUUQTTJUFTHPPHMFDPNTJUFCPPTUKQUJQTWBSJBOU 1 #include ! 2 #include ! 3 ! 4 int main()! 5 {! 6 // int ͱ string ͷͲͪΒ΋֨ೲՄೳ! 7 boost::variant v;! 8 ! 9 v = 42;! 10 v = "aaa";! 11 ! 12 return 0;! 13 }

Slide 3

Slide 3 text

WBSJBOU΁ͷΞΫηεɿHFU 1 boost::variant v;! 2 ! 3 switch(v.which()) {! 4 // 1ͭ໨ͷཁૉ͕ೖ͍ͬͯΔͱ͖! 5 case 0:! 6 int i = boost::get(v); // ࣦഊ͢Δͱྫ֎! 7 break;! 8 ! 9 // 2ͭ໨ͷཁૉ͕ೖ͍ͬͯΔͱ͖! 10 case 1:! 11 // ϙΠϯλΞΫηε! 12 std::string *d = boost::get(&v)! 13 break;! 14 }

Slide 4

Slide 4 text

CPPTUHFUͷ໰୊఺ w XIJDI Ͱࣄલʹத਎Λௐ΂ΔˠϚδοΫφϯόʔ w ϙΠϯλόʔδϣϯˠੜϙΠϯλ৮Γͨ͘ͳ͍ w ྫ֎όʔδϣϯˠຖ౓ྫ֎͕ඈͿͷ͸ʜ w HFU5 ͷ5͸WBSJBOU͕อ࣋͞Ε͍ͯͳ͍ܕͰ΋ ίϯύΠϧ௨ͬͯ͠·͏

Slide 5

Slide 5 text

CPPTUHFUͷվળ 1 ! 2 // boost::optional Ͱฦ͢όʔδϣϯΛͭ͘Δ! 3 template! 4 boost::optional get(Variant const& v);! 5 ! 6 boost::variant v;! 7 ! 8 if (auto maybe_int = get(v)) {! 9 auto const&value = *maybe_int;! 10 }

Slide 6

Slide 6 text

CPPTUHFUͷվળ 8 template! 9 inline boost::optional get(boost::variant const& v)! 10 {! 11 // Args... ͷதʹ T ͕ແ͚Ε͹Τϥʔ! 12 static_assert(! 13 is_included::value,! 14 "get_as(const&): T is not included in the variant."! 15 );! 16 ! 17 T const* const ptr = boost::get(&v);! 18 if (ptr) {! 19 return {*ptr};! 20 } else {! 21 return boost::none;! 22 }! 23 }

Slide 7

Slide 7 text

WBSJBOU΁ͷΞΫηεɿWJTJUPS 1 struct to_string! 2 : boost::static_visitor {! 3 template! 4 std::string operator()(T v)! 5 {! 6 return std::to_string(v);! 7 }! 8 };! 9 ! 10 int main()! 11 {! 12 boost::variant v;! 13 auto s1 = ! ! ! ! ! boost::apply_visitor(to_string{}, v);! 14 }

Slide 8

Slide 8 text

WJTJUPSͷվળɿϥϜμࣜ 1 struct to_string : boost::static_visitor {! 2 ! 3 template! 4 std::string operator()(T v)! 5 {! 6 return std::to_string(v);! 7 }! 8 };! 9 ! 10 int main()! 11 {! 12 boost::variant v;! 13 auto s1 = boost::apply_visitor(to_string{}, v);! 14 } 1 int main()! 2 {! 3 boost::variant v;! 4 auto s1 = apply_lambda(! 5 [](auto const& v){ return std::to_string(v); }! 6 , v! 7 );! 8 }

Slide 9

Slide 9 text

WJTJUPSͷվળɿϥϜμࣜ 1 template! 2 struct lambda_wrapped_visitor! 3 : public boost::static_visitor! 4 , public Lambda {! 5 ! 6 lambda_wrapped_visitor(Lambda const& l) noexcept! 7 : Lambda(l)! 8 {}! 9 };! 10 ! 11 template! 12 inline auto apply_lambda(Lambda const& l, boost::variant const& variant)! 13 {! 14 return boost::apply_visitor(! 15 detail::lambda_wrapped_visitor()(std::declval()))! 18 >{l}! 19 , variant);! 20 }

Slide 10

Slide 10 text

ཁૉҎ্ͷWBSJBOU 1 using holder =! 2 boost::mpl::vector< Type1! 3 ...! 4 , Type40 >;! 5 ! 6 typename boost::make_variant_over::type v; w σϑΥϧτཁૉ਺ɿʢWBSJBOU5 5 ʜ 5ʣ w ͨͩ͠਺Λ૿΍͗͢͠ΔͱίϯύΠϧ͕࣌ؒͻͲ͘ ͳΔ

Slide 11

Slide 11 text

UJQT·ͱΊ w CPPTUHFU ͷ໭Γ஋ΛPQUJPOBMʹͨ͠ w WJTJUPSʹϥϜμࣜΛ࢖͑ΔΑ͏ʹ w ཁૉҎ্Λ࣋ͭWBSJBOUͷͭ͘Γ͔ͨ