std::is_member_pointer - cppreference.com

From cppreference.com

template< class T > struct is_member_pointer;

(since C++11)

std::is_member_pointer is a UnaryTypeTrait.

If T is pointer to non-static member object or a pointer to non-static member function, provides the member constant value equal true. For any other type, value is false.

If the program adds specializations for std::is_member_pointer or std::is_member_pointer_v, the behavior is undefined.

Template parameters

Helper variable template

template< class T > constexpr bool is_member_pointer_v = is_member_pointer<T>::value;

(since C++17)

Inherited from std::integral_constant

Member constants

true if T is a member pointer type, false otherwise
(public static member constant)

Member functions

converts the object to bool, returns value
(public member function)
returns value
(public member function)

Member types

Type Definition
value_type bool
type std::integral_constant<bool, value>

Possible implementation

template<class T>
struct is_member_pointer_helper : std::false_type {};

template<class T, class U>
struct is_member_pointer_helper<T U::*> : std::true_type {};

template<class T>
struct is_member_pointer : is_member_pointer_helper<typename std::remove_cv<T>::type> {};

Example

#include <cassert>
#include <type_traits>

static_assert(!std::is_member_pointer_v<int*>);

struct S
{
    int i{42};
    int foo() { return 0xF00; }
};
using mem_int_ptr_t = int S::*;
using mem_fun_ptr_t = int (S::*)();
static_assert(std::is_member_pointer_v<mem_int_ptr_t>);
static_assert(std::is_member_pointer_v<mem_fun_ptr_t>);

int main()
{
    S s;

    mem_int_ptr_t pm = &S::i;
    assert(s.i == s.*pm);

    mem_fun_ptr_t pmf = &S::foo;
    assert((s.*pmf)() == s.foo());
}

See also