Member function traits

Reference

#include <actl/functional/traits/member_traits.hpp>
template<MemberFunction MF>
using ac::class_parameter_t = at_t<parameters_t<MF>, 0>

Class parameter of the member function including qualifiers.

template<typename T>
using ac::class_of_t = typename class_of<T>::type

Class corresponding to a member function or member data pointer excluding qualifiers.

template<typename T, typename Class>
using ac::as_member_of_t = typename as_member_of<T, Class>::type

Resulting type is different for different input types T:

  • If T is a free function, then it’s a member function of Class with the same parameters and return type.

  • If T is a member function, then it’s a member function of Class with the same member qualifiers, parameters and return type.

  • Otherwise, it’s a member data pointer T Class::*.

See tests at tests/functional/traits/MemberFunction.cpp

Member qualifier traits

For each member function qualifier, the following traits are provided:

  • Detection of the qualifier presence.

  • Addition of a qualifier (doesn’t change the type if already present).

  • Removal of a qualifier (doesn’t change the type if not present).

Table with the full list:

Qualifier

Detection

Addition

Removal

const

is_const_member_v

add_member_const_t

remove_member_const_t

volatile

is_volatile_member_v

add_member_volatile_t

remove_member_volatile_t

const
volatile

is_cv_member_v

add_member_cv_t

remove_member_cv_t

&

is_lvalue_reference_member_v

add_member_lvalue_reference_t

remove_member_reference_t

&&

is_rvalue_reference_member_v

add_member_rvalue_reference_t

remove_member_reference_t

Addition traits change the member function type in the following way, and removal traits do an inverse operation.

Trait name

Non-reference

Reference

Input type

int(Class::*)()

int(Class::*)() &

add_member_const_t

int(Class::*)() const

int(Class::*)() const&

add_member_volatile_t

int(Class::*)() volatile

int(Class::*)() volatile&

add_member_cv_t

int(Class::*)() const volatile

int(Class::*)() const volatile&

add_member_lvalue_reference_t

int(Class::*)() &

int(Class::*)() &

add_member_rvalue_reference_t

int(Class::*)() &&

int(Class::*)() &

Note

add_member_rvalue_reference_t doesn’t change the l-value reference because of the C++ reference collapsing rules.

Trait name

Non-reference

Reference

Input type

int(Class::*)() const volatile

int(Class::*)() const volatile&

remove_member_const_t

int(Class::*)() volatile

int(Class::*)() volatile&

remove_member_volatile_t

int(Class::*)() const

int(Class::*)() const&

remove_member_cv_t

int(Class::*)()

int(Class::*)() &

remove_member_reference_t

int(Class::*)() const volatile

int(Class::*)() const volatile

#include <actl/functional/traits/member_qualifiers.hpp>
namespace ac

Typedefs

template<MemberFunction MF>
using add_member_const_t = detail::modify_class_t<MF, add_inner_const>
template<MemberFunction MF>
using remove_member_const_t = detail::modify_class_t<MF, remove_inner_const>
template<MemberFunction MF>
using add_member_volatile_t = detail::modify_class_t<MF, add_inner_volatile>
template<MemberFunction MF>
using remove_member_volatile_t = detail::modify_class_t<MF, remove_inner_volatile>
template<MemberFunction MF>
using add_member_cv_t = detail::modify_class_t<MF, add_inner_cv>
template<MemberFunction MF>
using remove_member_cv_t = detail::modify_class_t<MF, remove_inner_cv>
template<MemberFunction MF>
using remove_member_reference_t = detail::modify_class_t<MF, std::remove_reference>
template<MemberFunction MF>
using add_member_lvalue_reference_t = detail::modify_class_t<MF, std::add_lvalue_reference>
template<MemberFunction MF>
using add_member_rvalue_reference_t = detail::modify_class_t<MF, std::add_rvalue_reference>

Variables

template<MemberFunction MF>
bool has_member_qualifiers_v = has_qualifiers_v<at_t<unique_parameters_t<MF>, 0>>

Checks if a member function has any of const, volatile, & or && qualifiers.

false only for functions like void(Class::*)(int).

template<MemberFunction MF>
bool is_const_member_v = std::is_const_v<std::remove_reference_t<detail::unique_class_t<MF>>>
template<MemberFunction MF>
bool is_volatile_member_v = std::is_volatile_v<std::remove_reference_t<detail::unique_class_t<MF>>>
template<MemberFunction MF>
bool is_cv_member_v = is_const_member_v<MF> && is_volatile_member_v<MF>
template<MemberFunction MF>
bool is_reference_member_v = std::is_reference_v<detail::unique_class_t<MF>>
template<MemberFunction MF>
bool is_lvalue_reference_member_v = std::is_lvalue_reference_v<detail::unique_class_t<MF>>
template<MemberFunction MF>
bool is_rvalue_reference_member_v = std::is_rvalue_reference_v<detail::unique_class_t<MF>>

See tests at tests/functional/traits/member_qualifiers.cpp