Add member pointer stuff to meta lib
This commit is contained in:
@ -194,6 +194,17 @@ template<typename R, typename... Args> struct _is_func_helper<R(Args...)> : true
|
|||||||
|
|
||||||
template<typename T> concept is_func = _is_func_helper<tame_t<T>>::value;
|
template<typename T> concept is_func = _is_func_helper<tame_t<T>>::value;
|
||||||
|
|
||||||
|
template<typename T> struct _is_member_ptr_helper : false_type {};
|
||||||
|
template<typename C, typename T> struct _is_member_ptr_helper<T C::*> : true_type
|
||||||
|
{
|
||||||
|
static constexpr bool kIsFunc = is_func<T>;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T> concept is_member_ptr = _is_member_ptr_helper<un_cv_t<T>>::value;
|
||||||
|
|
||||||
|
template<typename T> concept is_member_func_ptr = is_member_ptr<T> && _is_member_ptr_helper<un_cv_t<T>>::kIsFunc;
|
||||||
|
template<typename T> concept is_member_data_ptr = is_member_ptr<T> && !_is_member_ptr_helper<un_cv_t<T>>::kIsFunc;
|
||||||
|
|
||||||
template<typename T> concept is_object = !is_void<T> && !is_ref<T> && !is_func<T>;
|
template<typename T> concept is_object = !is_void<T> && !is_ref<T> && !is_func<T>;
|
||||||
|
|
||||||
template<typename T> struct _array_helper : false_type { using type = T; };
|
template<typename T> struct _array_helper : false_type { using type = T; };
|
||||||
|
@ -135,6 +135,12 @@ static_assert(!asl::is_ref<void>);
|
|||||||
static_assert(!asl::is_ref<void()>);
|
static_assert(!asl::is_ref<void()>);
|
||||||
static_assert(!asl::is_ref<void() const &&>);
|
static_assert(!asl::is_ref<void() const &&>);
|
||||||
|
|
||||||
|
struct MyClass
|
||||||
|
{
|
||||||
|
int data;
|
||||||
|
int fn(int x) { return x; } // NOLINT
|
||||||
|
};
|
||||||
|
|
||||||
static_assert(asl::is_ptr<int*>);
|
static_assert(asl::is_ptr<int*>);
|
||||||
static_assert(asl::is_ptr<const int* const>);
|
static_assert(asl::is_ptr<const int* const>);
|
||||||
static_assert(asl::is_ptr<const volatile int*>);
|
static_assert(asl::is_ptr<const volatile int*>);
|
||||||
@ -142,6 +148,26 @@ static_assert(!asl::is_ptr<int>);
|
|||||||
static_assert(!asl::is_ptr<void>);
|
static_assert(!asl::is_ptr<void>);
|
||||||
static_assert(!asl::is_ptr<void()>);
|
static_assert(!asl::is_ptr<void()>);
|
||||||
static_assert(!asl::is_ptr<void() const &&>);
|
static_assert(!asl::is_ptr<void() const &&>);
|
||||||
|
static_assert(!asl::is_ptr<int MyClass::*>);
|
||||||
|
static_assert(!asl::is_ptr<int (MyClass::*)(int)>);
|
||||||
|
|
||||||
|
static_assert(!asl::is_member_ptr<int*>);
|
||||||
|
static_assert(!asl::is_member_ptr<void()>);
|
||||||
|
static_assert(!asl::is_member_ptr<void() const &&>);
|
||||||
|
static_assert(asl::is_member_ptr<int MyClass::*>);
|
||||||
|
static_assert(asl::is_member_ptr<int (MyClass::*)(int)>);
|
||||||
|
|
||||||
|
static_assert(!asl::is_member_data_ptr<int*>);
|
||||||
|
static_assert(!asl::is_member_data_ptr<void()>);
|
||||||
|
static_assert(!asl::is_member_data_ptr<void() const &&>);
|
||||||
|
static_assert(asl::is_member_data_ptr<int MyClass::*>);
|
||||||
|
static_assert(!asl::is_member_data_ptr<int (MyClass::*)(int)>);
|
||||||
|
|
||||||
|
static_assert(!asl::is_member_func_ptr<int*>);
|
||||||
|
static_assert(!asl::is_member_func_ptr<void()>);
|
||||||
|
static_assert(!asl::is_member_func_ptr<void() const &&>);
|
||||||
|
static_assert(!asl::is_member_func_ptr<int MyClass::*>);
|
||||||
|
static_assert(asl::is_member_func_ptr<int (MyClass::*)(int)>);
|
||||||
|
|
||||||
static_assert(asl::same_as<int, asl::tame_t<int>>);
|
static_assert(asl::same_as<int, asl::tame_t<int>>);
|
||||||
static_assert(asl::same_as<int(), asl::tame_t<int()>>);
|
static_assert(asl::same_as<int(), asl::tame_t<int()>>);
|
||||||
|
Reference in New Issue
Block a user