scl-utility

Member like типажи

Это набор вспомогательных инструментов (типажей) для построения типов указателей на члены класса на основе cv/ref-квалификаторов типа объекта и дескриптора целевого члена. Эти шаблоны помогают формировать типы указателей на методы и свойства класса единообразным и выразительным способом.

Содержание:


member_function_like_t<Type, Signature>

Формирует тип указателя на нестатическую функцию-член для класса Type и сигнатуры Signature, копируя cv- и ref-квалификаторы из Type и спецификатор noexcept из Signature.

Семантика

Примеры

#include <type_traits>
#include <scl/utility/type_traits/member_like.h>

struct X {};

using ::scl::member_function_like_t;

// Без ref-квалификатора и noexcept
static_assert(std::is_same_v<member_function_like_t<X, void()>, void (X::*)()>);
static_assert(std::is_same_v<member_function_like_t<X const, void()>, void (X::*)() const>);
static_assert(std::is_same_v<member_function_like_t<X volatile, void()>, void (X::*)() volatile>);
static_assert(std::is_same_v<member_function_like_t<X const volatile, void()>, void (X::*)() const volatile>);

// С lvalue-квалификатором (&), без noexcept
static_assert(std::is_same_v<member_function_like_t<X&, void()>, void (X::*)() &>);
static_assert(std::is_same_v<member_function_like_t<X const&, void()>, void (X::*)() const &>);
static_assert(std::is_same_v<member_function_like_t<X volatile&, void()>, void (X::*)() volatile &>);
static_assert(std::is_same_v<member_function_like_t<X const volatile&, void()>, void (X::*)() const volatile &>);

// С rvalue-квалификатором (&&), без noexcept
static_assert(std::is_same_v<member_function_like_t<X&&, void()>, void (X::*)() &&>);
static_assert(std::is_same_v<member_function_like_t<X const&&, void()>, void (X::*)() const &&>);
static_assert(std::is_same_v<member_function_like_t<X volatile&&, void()>, void (X::*)() volatile &&>);
static_assert(std::is_same_v<member_function_like_t<X const volatile&&, void()>, void (X::*)() const volatile &&>);

// С noexcept
static_assert(std::is_same_v<member_function_like_t<X, void() noexcept>, void (X::*)() noexcept>);
static_assert(std::is_same_v<member_function_like_t<X const, void() noexcept>, void (X::*)() const noexcept>);

// С сохранением аргументов
static_assert(std::is_same_v<member_function_like_t<X const&, int(short)>, int (X::*)(short) const &>);

Типичные сценарии использования

См. также


member_property_like_t<Type, Member>

Формирует тип указателя на член-данное для класса Type и типа члена Member, накладывая cv-квалификаторы объекта на тип члена.

Семантика

Примеры

#include <type_traits>
#include <scl/utility/type_traits/member_like.h>

struct X { int a = 0; int const b = 1; };

using ::scl::member_property_like_t;

// Квалификаторы объекта накладываются на Member
static_assert(std::is_same_v<member_property_like_t<X, int>, int X::*>);
static_assert(std::is_same_v<member_property_like_t<X const, int>, int const X::*>);
static_assert(std::is_same_v<member_property_like_t<X volatile, int>, int volatile X::*>);
static_assert(std::is_same_v<member_property_like_t<X const volatile, int>, int const volatile X::*>);

// Ссылки на Type не влияют на члены-данные
static_assert(std::is_same_v<member_property_like_t<X&, int>, int X::*>);
static_assert(std::is_same_v<member_property_like_t<X const&, int>, int const X::*>);

// Собственные cv-квалификаторы члена сохраняются (и объединяются с квалификаторами объекта)
static_assert(std::is_same_v<member_property_like_t<X, int const>, int const X::*>);
static_assert(std::is_same_v<member_property_like_t<X const, int volatile>, int const volatile X::*>);

Типичные сценарии использования

См. также


member_like_t<Type, T>

Обобщённый селектор, который создаёт тип указателя на член для класса Type и дескриптора T:

Семантика

Примеры

#include <type_traits>
#include <scl/utility/type_traits/member_like.h>

struct X { int a = 0; int const b = 1; };

using ::scl::member_like_t;

// Функции-члены
static_assert(std::is_same_v<member_like_t<X, void()>, void (X::*)()>);
static_assert(std::is_same_v<member_like_t<X const&, int(short)>, int (X::*)(short) const &>);
static_assert(std::is_same_v<member_like_t<X const volatile, void(int) noexcept>, void (X::*)(int) const volatile noexcept>);

// Члены-данные
static_assert(std::is_same_v<member_like_t<X, int>, int X::*>);
static_assert(std::is_same_v<member_like_t<X const, int>, int const X::*>);
static_assert(std::is_same_v<member_like_t<X, int const>, int const X::*>);

Типичные сценарии использования

См. также


Примечания