11#ifndef LIB_RTTI_UTILS_H_
12#define LIB_RTTI_UTILS_H_
27struct has_rtti : std::is_base_of<RTTI::Base, T> {};
35template <
typename... Ts>
36inline constexpr const bool all_have_rtti_v = (has_rtti_v<Ts> && ...);
43template <
typename T,
typename R =
void>
49template <
typename... Ts>
50using enable_if_all_have_rtti_t = std::enable_if_t<all_have_rtti_v<Ts...>,
void>;
57template <
typename T,
typename R =
void>
62template <
typename To,
typename = enable_if_has_rtti_t<To>>
64 template <
typename From,
typename = enable_if_has_rtti_t<From>>
65 To *operator()(From *obj)
const {
66 return obj ? obj->template to<To>() :
nullptr;
69 template <
typename From,
typename = enable_if_has_rtti_t<From>>
70 const To *operator()(
const From *obj)
const {
71 return obj ? obj->template to<To>() :
nullptr;
75template <
typename... Targets>
79 static_assert(
sizeof...(Targets) > 0,
80 "At least one target type needs to be given for RTTI::is");
81 static_assert(all_have_rtti_v<Targets...>,
82 "All types in RTTI::is<Ts> need to be custom-rtti-enabled");
84 template <
typename From,
typename = enable_if_has_rtti_t<From>>
85 bool operator()(
const From *obj)
const {
86 return obj && (obj->template is<Targets>() || ...);
107template <
typename To>
121template <
typename Target>
133template <
typename... Targets>
Definition rtti_utils.h:78
Definition rtti_utils.h:63
Definition rtti_utils.h:44
Definition rtti_utils.h:27