28 #include <type_traits>
32 template <
class T,
class... Ts>
37 template <
class T,
class T0,
class... Ts>
39 std::bool_constant<std::is_same_v<T, T0> && is_in_types<T, Ts...>::value>
42 template <
class T,
class... Ts>
74 template <
template <
class...>
class Template,
class T>
82 template <
template <
class...>
class Template,
class... Params>
83 struct IsInstanceOf<Template, Template<Params...>> : std::true_type
87 template <
template <
class...>
class Template,
class T>
90 template <
class T,
template <
class...>
class... Templates>
93 static_assert(!IsInstanceOfAnyV<int, RemoveRvalueReference, std::tuple>);
103 template <
template <
class...>
class Template,
class... Params>
106 template <
template <
class...>
class NewTemplate>
109 template <
class... NewParams>
117 template <
class T0,
class... Ts>
119 typename std::tuple_element<
sizeof...(Ts), std::tuple<T0, Ts...>>::type>::type;
124 template <
class T0,
class... Ts>
129 template <
class T0,
class T1,
class... Ts>
134 template <
class T0,
class T1,
class T2,
class... Ts>
137 template <std::size_t n,
class... Ts>
142 template <std::size_t n,
class T0,
class... Ts>
146 typename std::decay<
typename std::tuple_element<n, std::tuple<T0, Ts...>>
::type>
::type;
152 template <std::size_t n,
class T0,
class... Ts>
154 typename std::decay<
typename std::tuple_element<n, std::tuple<T0, Ts...>>::type>::type;
161 template <
class T,
class =
void>
174 typename
std::enable_if<
175 std::is_same<decltype(std::to_string(std::declval<T>()), int{}), int>::value>::type> :
189 template <
class T,
class IdxT,
class =
void>
199 template <
class T,
class IdxT>
202 typename
std::enable_if<
203 std::is_same<decltype(std::declval<T>().at(std::declval<IdxT>()), int{}),
204 int>::value>::type> : std::true_type
211 #define ARMARX_META_MAKE_HAS_MEMBER_FNC_CHECK(CHECKNAME, FNCNAME, FNCSIG) \
222 template <class C, C> \
223 struct classAndFncPtr; \
225 static one has(classAndFncPtr<FNCSIG, &C::FNCNAME>*); \
226 template <class T2> \
227 static two has(...); \
230 static constexpr bool value = sizeof(has<T>(0)) == sizeof(one); \
233 static constexpr bool CHECKNAME##_v = CHECKNAME<T>::value
235 template <std::size_t...>
244 template <
class S1,
class S2>
247 template <std::size_t... I1, std::size_t... I2>
253 template <std::
size_t N>
266 template <std::
size_t N>
269 typename MakeIndexSequence<N - N / 2>::type>
273 template <std::
size_t Lo,
class>
276 template <std::size_t Lo, std::size_t... Is>
282 template <std::
size_t Lo, std::
size_t Hi>
290 template <std::
size_t N>
293 template <std::
size_t Lo, std::
size_t Hi>
296 template <
class... Ts>
308 using type =
typename std::decay<T>::type;
323 template <
class T, std::
size_t N>
344 template <
class Base,
class... Ds>
349 template <
class Base,
class D0,
class... Ds>
351 std::integral_constant<bool,
352 std::is_base_of<Base, D0>::value && IsBaseOf<Base, Ds...>::value>
359 template <
class T,
class... Others>
360 static constexpr
bool is_any_of_v = (std::is_same_v<T, Others> || ...);
366 template <
typename S,
typename T>
369 template <
typename SS,
typename TT>
370 static auto test(
int)
371 -> decltype(std::declval<SS&>() << std::declval<TT>(), std::true_type());
373 template <
typename,
typename>
374 static auto test(...) -> std::false_type;