VCCC  2024.05
VisualCamp Common C++ library
derived_from_single_crtp.hpp
Go to the documentation of this file.
1 //
2 // Created by yonggyulee on 2024/01/01.
3 //
4 
5 #ifndef VCCC_TYPE_TRAITS_IS_DERIVED_FROM_SINGLE_CRTP_HPP
6 #define VCCC_TYPE_TRAITS_IS_DERIVED_FROM_SINGLE_CRTP_HPP
7 
11 
12 namespace vccc {
13 namespace detail {
14 
15 template<typename T, typename = void>
16 
17 struct has_typename_vccc_derived : std::false_type {};
18 template<typename T>
19 struct has_typename_vccc_derived<T, void_t<typename T::_$vccc_derived>> : std::true_type {};
20 
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>>;
25 };
26 
27 template<
28  typename Derived,
29  template<typename> class Base,
30  bool = is_referencable<Derived>::value /* true */
31 >
32 struct derived_from_single_crtp_impl
33 #if defined(_MSC_VER) && _MSC_VER < 1930 // Ambigious casting is allowed until Visutal Studio 2022
34  : has_typename_vccc_derived<Derived> {};
35 #else
36  : is_invocable_r<
37  std::false_type, derived_from_single_crtp_tester<Base>, Derived&, Derived&>{};
38 #endif
39 
40 template<typename Derived, template<typename> class Base>
41 struct derived_from_single_crtp_impl<Derived, Base, false> : std::false_type {};
42 
43 } // namespace detail
44 
47 
48 
50 template<typename Derived, template<typename> class Base>
51 struct derived_from_single_crtp : detail::derived_from_single_crtp_impl<Derived, Base> {};
52 
54 
55 } // namespace vccc
56 
57 #endif // VCCC_TYPE_TRAITS_IS_DERIVED_FROM_SINGLE_CRTP_HPP
void void_t
Definition: void_t.hpp:19
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