5 #ifndef VCCC_TYPE_TRAITS_IS_DERIVED_FROM_SINGLE_CRTP_HPP
6 #define VCCC_TYPE_TRAITS_IS_DERIVED_FROM_SINGLE_CRTP_HPP
15 template<
typename T,
typename =
void>
17 struct has_typename_vccc_derived : std::false_type {};
19 struct has_typename_vccc_derived<T,
void_t<typename T::_$vccc_derived>> : std::true_type {};
21 template<
template<
typename>
class Base>
22 struct derived_from_single_crtp_tester {
23 template<
typename T,
typename U>
24 auto operator()(
const T&,
const Base<U>&)
const -> same_as<T, Base<U>>;
29 template<
typename>
class Base,
32 struct derived_from_single_crtp_impl
33 #if defined(_MSC_VER) && _MSC_VER < 1930
34 : has_typename_vccc_derived<Derived> {};
37 std::false_type, derived_from_single_crtp_tester<Base>, Derived&, Derived&>{};
40 template<
typename Derived,
template<
typename>
class Base>
41 struct derived_from_single_crtp_impl<Derived, Base, false> : std::false_type {};
50 template<
typename Derived,
template<
typename>
class Base>
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35
specifies that a type is derived from single specialization of CRTP base
Definition: derived_from_single_crtp.hpp:51