2 #include <ossia/detail/variant.hpp>
4 #include <boost/mp11/algorithm.hpp>
21 template <
typename Arg>
22 auto operator()(Arg&& arg)
const
24 return impl(*std::forward<Arg>(arg));
27 auto operator()()
const {
return impl(); }
30 template <
typename Variant,
typename Base>
31 Variant make_subtype_variant(
const Base&)
38 template <
typename Variant,
typename Base,
typename Arg,
typename... SubArgs>
39 Variant make_subtype_variant(Base& base)
41 if(
auto derived =
dynamic_cast<Arg*
>(&base))
43 return Variant(derived);
46 return make_subtype_variant<Variant, Base, SubArgs...>(base);
49 template <
typename Variant,
typename Base,
typename Arg,
typename... SubArgs>
50 Variant make_subtype_variant(
const Base& base)
52 if(
auto derived =
dynamic_cast<const Arg*
>(&base))
54 return Variant(derived);
57 return make_subtype_variant<Variant, Base, SubArgs...>(base);
70 template <
typename Base,
typename... Args>
73 using arg_list = ossia::variant<Args...>;
74 using ptr_list = boost::mp11::mp_transform<std::add_pointer_t, arg_list>;
80 : m_impl(detail::make_subtype_variant<ptr_list, Base, Args...>(b))
85 : m_impl(detail::make_subtype_variant<ptr_list, Base, Args...>(b))
Tools to build a variant type from classes in a same hierarchy.
Definition: SubtypeVariant.hpp:72
Base toolkit upon which the software is built.
Definition: Application.cpp:90
Proxy visitor that dereferences before calling the actual visitor.
Definition: SubtypeVariant.hpp:18