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))
18 std::forward<VisitorType>(visitor)(*ptr);
23 if constexpr (StartIndex + 1 < EndIndex)
26 visit_variant(std::forward<VisitorType>(visitor) , std::forward<VariantType>(vt));
32 template<
typename VisitorType,
typename VariantType>
33 void visit(VisitorType&& visitor, VariantType&& vt)
38 constexpr size_t VariantSize = std::variant_size_v<variant_t>;
41 visit_variant(std::forward<VisitorType>(visitor), std::forward<VariantType>(vt));
44 template<
typename... VisitorTypes>
47 using VisitorTypes::operator()...;
50 VisitorTypes{visitors}... { }
55 template<
typename... VisitorTypes>
64 using name_t =
const char*;
66 using weight_t = double;
67 using variant_t = std::variant<name_t, age_t, weight_t>;
69 using container_t = std::vector<variant_t>;
73 info.emplace_back(
"Thomas Kim");
74 info.emplace_back(30);
75 info.emplace_back(60.5);
76 info.emplace_back(
"Sophie Turner");
77 info.emplace_back(20);
78 info.emplace_back(56.7);
133 for(
const auto& vt: info)
148 for(
const auto& vt: info)
Type to string name conversions are defined.
enable_if_variant_t< VariantType > visit(VisitorType &&visitor, VariantType &&vt)
overloaded(VisitorTypes...) -> overloaded< VisitorTypes... >
void visit(VisitorType &&visitor, VariantType &&vt)
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)
overloaded(VisitorTypes... visitors)
Stream output operators << are implemented.
#define Tpf_GetTypeCategory(instance_arg)
A macro that returns instance_arg's type category string name.