6#include "utils/traits.h"
11template <
typename T,
typename Variant,
typename =
void>
17template <
typename T,
typename... Ts>
21 std::void_t<decltype (std::variant<Ts...> ())>>
22 : std::bool_constant<(std::is_same_v<T, Ts> || ...)>
27template <
typename T,
typename Variant>
32using MyVariant = std::variant<int, double, std::string>;
43template <
typename... Variants>
44using merge_variants_t =
typename merge_variants<Variants...>::type;
53template <
typename... Types1,
typename... Types2,
typename... Rest>
54struct merge_variants<std::variant<Types1...>, std::variant<Types2...>, Rest...>
57 using type = merge_variants_t<std::variant<Types1..., Types2...>, Rest...>;
73 using type = std::variant<std::reference_wrapper<Ts>...>;
80template <
typename Variant>
85template <
typename... Ts>
88 using type = std::variant<std::reference_wrapper<const Ts>...>;
90template <
typename Variant>
91using to_const_reference_variant =
101 using type = std::variant<std::unique_ptr<Ts>...>;
108template <
typename Variant>
118 using type = std::variant<std::add_pointer_t<Ts>...>;
125template <
typename Variant>
142template <
typename Variant,
typename Base>
143 requires std::is_pointer_v<std::variant_alternative_t<0, Variant>>
145convert_to_variant (
const Base * base_ptr) -> Variant
154 auto trycast = [&]<
typename T> () {
155 if (
auto derived =
dynamic_cast<const T *
> (base_ptr))
157 result =
const_cast<T *
> (derived);
163 auto try_all_casts = [&]<
typename... Ts> (std::variant<Ts...> *) {
164 return (trycast.template
operator()<std::remove_pointer_t<Ts>> () || ...);
167 try_all_casts (
static_cast<Variant *
> (
nullptr));
183 using Ts::operator()...;
188template <
typename Variant,
template <
typename>
class Wrapper>
192template <
typename... Ts,
template <
typename>
class Wrapper>
196 using type = std::variant<Wrapper<Ts>...>;
205template <
typename Variant,
template <
typename>
class Wrapper>
std::variant< std::add_pointer_t< Ts >... > type
The resulting variant type with pointers.
Helper struct to convert a variant to a variant of pointers.
std::variant< std::reference_wrapper< Ts >... > type
The resulting variant type with reference_wrappers.
Helper struct to convert a variant to a variant of references.
std::variant< std::unique_ptr< Ts >... > type
The resulting variant type with reference_wrappers.
Helper struct to convert a variant to a variant of unique_ptr's.
std::variant< Wrapper< Ts >... > type
The resulting variant type with wrapped types.
Helper struct to convert a variant to a variant of ArrangerObjectOwner<T>.