8 template<
size_t StartIndex,
size_t EndIndex>
9 struct compile_time_loop
11 template<
typename VisitorType,
typename VariantType>
14 if constexpr(StartIndex < EndIndex)
16 if(
auto ptr = std::get_if<StartIndex>(&vt))
19 std::get<StartIndex>(visitor.m_visitors)(*ptr);
24 if constexpr (StartIndex + 1 < EndIndex)
27 visit_variant(std::forward<VisitorType>(visitor) , std::forward<VariantType>(vt));
33 template<
typename VisitorType,
typename VariantType>
34 void visit(VisitorType&& visitor, VariantType&& vt)
39 constexpr size_t VariantSize = std::variant_size_v<variant_t>;
41 compile_time_loop<0, VariantSize>:: template
42 visit_variant(std::forward<VisitorType>(visitor), std::forward<VariantType>(vt));
45 template<
typename... VisitorTypes>
55 template<
typename ContainerType>
58 for(
decltype(
auto) vt:
59 std::forward<ContainerType>(container))
68 template<
typename... VisitorTypes>
77 using name_t =
const char*;
79 using weight_t = double;
80 using variant_t = std::variant<name_t, age_t, weight_t>;
82 using container_t = std::vector<variant_t>;
86 info.emplace_back(
"Thomas Kim");
87 info.emplace_back(30);
88 info.emplace_back(60.5);
89 info.emplace_back(
"Sophie Turner");
90 info.emplace_back(20);
91 info.emplace_back(56.7);
134 for(
const auto& vt: info)
151 using name_t =
const char*;
153 using weight_t = double;
154 using variant_t = std::variant<name_t, age_t, weight_t>;
156 using container_t = std::vector<variant_t>;
160 info.emplace_back(
"Thomas Kim");
161 info.emplace_back(30);
162 info.emplace_back(60.5);
163 info.emplace_back(
"Sophie Turner");
164 info.emplace_back(20);
165 info.emplace_back(56.7);
194 handle_info.for_each(info);
201 using name_t =
const char*;
203 using weight_t = double;
204 using variant_t = std::variant<name_t, age_t, weight_t>;
206 using container_t = std::set<variant_t>;
210 info.emplace(
"Thomas Kim");
213 info.emplace(
"Sophie Turner");
243 handle_info.for_each(info);
257 using key_t =
const char*;
258 using name_t =
const char*;
260 using weight_t = double;
261 using variant_t = std::variant<name_t, age_t, weight_t>;
263 using container_t = std::map<key_t, variant_t>;
267 info[
"Programmer"] =
"Thomas Kim";
269 info[
"Weight"] = 60.5;
270 info[
"Actress"] =
"Sophie Turner";
271 info[
"Her age"] = 20;
272 info[
"Her weight"] = 56.7;
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.
enable_if_variant_t< VariantType > visit(VisitorType &&visitor, VariantType &&vt)
overloaded(VisitorTypes...) -> overloaded< VisitorTypes... >
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 void visit_variant(VisitorType &&visitor, VariantType &&vt)
static enable_if_variant_t< VariantType > visit_variant(VisitorType &&visitor, VariantType &&vt)
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.