96#ifndef CbmStructLooper_h
97#define CbmStructLooper_h 1
112 template<
class Handler,
class... Variables>
127 template<
typename HandlerPtr,
class Visitor, std::enable_if_t<is_po
inter_to_v<HandlerPtr, Handler>,
bool> = true>
128 constexpr void ForEachValue(HandlerPtr handler, Visitor&& visitor)
const
138 template<
typename HandlerPtr,
class Visitor, std::enable_if_t<is_po
inter_to_v<HandlerPtr, Handler>,
bool> = true>
141 std::apply([&](
auto&&...
v) { ((std::invoke(std::forward<Visitor>(visitor), handler->*
v)), ...); },
155 template<
class Visitor,
class VarPtrType,
typename HandlerPtr,
156 std::enable_if_t<is_pointer_to_v<HandlerPtr, Handler>,
bool> =
true>
157 constexpr void VisitValue(HandlerPtr handler, Visitor&& visitor, VarPtrType&& varAddr)
const
159 using VarType = std::remove_const_t<std::remove_reference_t<
decltype(handler->*varAddr)>>;
163 if ((handler->*varAddr).has_value()) {
164 std::invoke(std::forward<Visitor>(visitor), *(handler->*varAddr));
168 std::invoke(std::forward<Visitor>(visitor), handler->*varAddr);
Different metaprogramming utilities (type traits) for CBM experiment.
constexpr StructLooper(Variables Handler::*... vars)
Constructor.
constexpr void ForEachVariable(HandlerPtr handler, Visitor &&visitor) const
Applies a visitor callable to variables.
constexpr void ForEachValue(HandlerPtr handler, Visitor &&visitor) const
Applies a visitor callable to values, which are stored in registered variables.
constexpr void VisitValue(HandlerPtr handler, Visitor &&visitor, VarPtrType &&varAddr) const
A visit function for variables.
const std::tuple< Variables Handler::*... > fVariableTuple
A tuple, containing addresses of the class variables.
constexpr bool is_std_optional_v