basedOpinionated utility library |
git clone git://git.dimitrijedobrota.com/based.git |
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING |
base_of.hpp (912B)
0 #pragma once
2 #include "based/trait/integral_constant.hpp"
3 #include "based/trait/is/class.hpp"
5 namespace based
6 {
8 namespace details
9 {
11 template<class B>
12 true_type test_ptr_conv(const volatile B*);
14 template<class>
15 false_type test_ptr_conv(const volatile void*);
17 template<class B, class D>
18 auto test_is_base_of(int)
19 -> decltype(test_ptr_conv<B>(static_cast<D*>(nullptr)));
21 template<class, class>
22 auto test_is_base_of(...) -> true_type; // private or ambiguous base
24 } // namespace details
26 template<class Base, class Derived>
27 struct is_base_of : false_type
28 {
29 };
31 template<class Base, class Derived>
32 requires(
33 is_class_v<Base> && is_class_v<Derived>
34 && decltype(details::test_is_base_of<Base, Derived>(0))::value
35 )
36 struct is_base_of<Base, Derived> : true_type
37 {
38 };
40 template<class Base, class Derived>
41 constexpr bool is_base_of_v = is_base_of<Base, Derived>::value;
43 } // namespace based