12 #include <type_traits>
13 #include <boost/fusion/include/at_c.hpp>
14 #include <boost/fusion/adapted/struct/adapt_struct.hpp>
15 #include <boost/fusion/include/adapt_struct.hpp>
27 template<
typename T,
typename Concrete>
28 struct IndirectHolderBase
41 template<
typename U = T,
typename Sub =
typename U::value_type>
50 return static_cast<Concrete&
> (*this);
69 template<
typename T,
typename...
Tags>
70 struct PKey : IndirectHolderBase<T, PKey<T, Tags...>>
72 using PKey::IndirectHolderBase::IndirectHolderBase;
75 template<
typename T,
typename... Args>
81 using Unique::IndirectHolderBase::IndirectHolderBase;
90 using NotNull::IndirectHolderBase::IndirectHolderBase;
102 struct IsReferencesTarget : std::false_type {};
104 template<
typename U,
typename...
Tags>
105 struct IsReferencesTarget<
PKey<U,
Tags...>> : std::true_type {};
108 struct IsReferencesTarget<
Unique<U>> : std::true_type {};
117 using References::IndirectHolderBase::IndirectHolderBase;
119 template<
typename T,
typename...
Tags>
125 template<
typename T,
typename...
Tags>
136 template<
int... Fields>
139 template<
int... Fields>
142 template<
typename... Args>
145 template<
auto... Fields>
148 template<
typename... Args>
154 template<
typename T,
typename... Args>
168 inline static struct DefaultTag {}
Default;
169 inline static struct IgnoreTag {}
Ignore;
175 template<
auto... Ptrs>
181 template<
auto... Ptrs>
182 inline static FieldsType<Ptrs...>
Fields {};
184 template<
typename Seq>
190 template<
typename Seq>
202 template<
typename Tag>