8 template<
typename Type>
11 static constexpr bool value =
false;
14 template<
typename Type_1,
typename Type_2>
15 struct is_pair_type_st<
std::pair<Type_1, Type_2>>
17 static constexpr bool value =
true;
20 template<
typename Type>
21 constexpr bool is_pair_type_v = is_pair_type_st<remove_cv_ref_t<Type>>::value;
23 template<
typename Type>
24 struct is_variant_type_st
26 static constexpr bool value =
false;
29 template<
typename... Types>
30 struct is_variant_type_st<
std::variant<Types...>>
32 static constexpr bool value =
true;
35 template<
typename Type>
36 constexpr bool is_variant_type_v = is_variant_type_st<remove_cv_ref_t<Type>>::value;
38 template<
typename Type,
typename ReturnType =
void>
41 template<
typename Type,
typename ReturnType =
void>
44 template<
size_t StartIndex,
size_t EndIndex>
45 struct compile_time_loop
48 template<
typename VisitorType,
typename VariantType>
49 static enable_if_variant_t<VariantType>
52 if constexpr(StartIndex < EndIndex)
54 if(
auto ptr = std::get_if<StartIndex>(&vt))
57 std::get<StartIndex>(visitor.m_visitors)(*ptr);
62 if constexpr (StartIndex + 1 < EndIndex)
65 visit_variant(std::forward<VisitorType>(visitor) , std::forward<VariantType>(vt));
70 template<
typename VisitorType,
typename PairType>
74 if constexpr(StartIndex < EndIndex)
76 auto& [key, vt] = std::forward<PairType>(pair);
78 if(
auto ptr = std::get_if<StartIndex>(&vt))
81 std::get<StartIndex>(visitor.m_visitors)(key, *ptr);
86 if constexpr (StartIndex + 1 < EndIndex)
89 visit_variant(std::forward<VisitorType>(visitor) , std::forward<PairType>(pair));
96 template<
typename VisitorType,
typename VariantType>
97 enable_if_variant_t<VariantType>
98 visit(VisitorType&& visitor, VariantType&& vt)
103 constexpr size_t VariantSize = std::variant_size_v<variant_t>;
105 compile_time_loop<0, VariantSize>:: template
106 visit_variant(std::forward<VisitorType>(visitor), std::forward<VariantType>(vt));
110 template<
typename VisitorType,
typename PairType>
111 enable_if_pair_t<PairType>
112 visit(VisitorType&& visitor, PairType&& pair)
115 using variant_t =
typename pair_t::second_type;
119 constexpr size_t VariantSize = std::variant_size_v<variant_t>;
122 visit_variant(std::forward<VisitorType>(visitor), std::forward<PairType>(pair));
125 template<
typename... VisitorTypes>
135 template<
typename ContainerType>
138 for(
decltype(
auto) vt:
139 std::forward<ContainerType>(container))
148 template<
typename... VisitorTypes>
157 using name_t =
const char*;
159 using weight_t = double;
160 using variant_t = std::variant<name_t, age_t, weight_t>;
162 using container_t = std::vector<variant_t>;
166 info.emplace_back(
"Thomas Kim");
167 info.emplace_back(30);
168 info.emplace_back(60.5);
169 info.emplace_back(
"Sophie Turner");
170 info.emplace_back(20);
171 info.emplace_back(56.7);
214 for(
const auto& vt: info)
231 using name_t =
const char*;
233 using weight_t = double;
234 using variant_t = std::variant<name_t, age_t, weight_t>;
236 using container_t = std::vector<variant_t>;
240 info.emplace_back(
"Thomas Kim");
241 info.emplace_back(30);
242 info.emplace_back(60.5);
243 info.emplace_back(
"Sophie Turner");
244 info.emplace_back(20);
245 info.emplace_back(56.7);
274 handle_info.for_each(info);
281 using name_t =
const char*;
283 using weight_t = double;
284 using variant_t = std::variant<name_t, age_t, weight_t>;
286 using container_t = std::set<variant_t>;
290 info.emplace(
"Thomas Kim");
293 info.emplace(
"Sophie Turner");
323 handle_info.for_each(info);
337 using key_t =
const char*;
338 using name_t =
const char*;
340 using weight_t = double;
341 using variant_t = std::variant<name_t, age_t, weight_t>;
343 using container_t = std::map<key_t, variant_t>;
347 info[
"Programmer"] =
"Thomas Kim";
349 info[
"Weight"] = 60.5;
350 info[
"Actress"] =
"Sophie Turner";
351 info[
"Her age"] = 20;
352 info[
"Her weight"] = 56.7;
377 handle_info.for_each(info);
void test_visit_simplified_map()
void test_visit_simplified()
void test_visit_simplified_set()
constexpr auto reverse(sequence< ms... > mm, sequence< rs... >)
Type to string name conversions are defined.
std::enable_if_t< is_variant_type_v< Type >, ReturnType > enable_if_variant_t
std::enable_if_t< is_pair_type_v< Type >, ReturnType > enable_if_pair_t
constexpr bool is_variant_type_v
enable_if_variant_t< VariantType > visit(VisitorType &&visitor, VariantType &&vt)
overloaded(VisitorTypes...) -> overloaded< VisitorTypes... >
enable_if_pair_t< PairType > visit(VisitorType &&visitor, PairType &&pair)
constexpr bool is_pair_type_v
std::enable_if_t< is_pair_of_variant_v< remove_cv_ref_t< PairType > > > visit_variant(VisitorType &&visit, PairType &&vpr)
std::remove_cv_t< std::remove_reference_t< Type > > remove_cv_ref_t
Remove const volatile reference from Type.
static enable_if_variant_t< VariantType > visit_variant(VisitorType &&visitor, VariantType &&vt)
static enable_if_pair_t< PairType > visit_variant(VisitorType &&visitor, PairType &&pair)
static constexpr bool value
static constexpr bool value
void for_each(ContainerType &&container)
std::tuple< VisitorTypes... > vistors_t
overloaded(VisitorTypes... visitors)
Stream output operators << are implemented.
#define Tpf_GetTypeCategory(instance_arg)
A macro that returns instance_arg's type category string name.