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 |
|
|
|
volatile |
|
|
|
const
volatile
|
|
|
|
& |
|
|
|
&& |
|
|
|
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 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#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.falseonly for functions likevoid(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>>¶
-
template<MemberFunction MF>
See tests at tests/functional/traits/member_qualifiers.cpp