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> 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> 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() const &&>);
|
||||
|
||||
struct MyClass
|
||||
{
|
||||
int data;
|
||||
int fn(int x) { return x; } // NOLINT
|
||||
};
|
||||
|
||||
static_assert(asl::is_ptr<int*>);
|
||||
static_assert(asl::is_ptr<const int* const>);
|
||||
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() 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()>>);
|
||||
|
Reference in New Issue
Block a user