scl-utility

Member-like type traits

Utilities for building pointer-to-member types based on an object type’s cv/ref qualifiers and a target descriptor. These traits help you form pointer-to-member-function and pointer-to-data-member types in a uniform, expressive way.

Contents:


member_function_like_t<Type, Signature>

Builds a pointer-to-non-static-member-function type for class Type and function Signature, mirroring the cv- and ref-qualifiers from Type and the noexcept from Signature.

Semantics

Examples

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

struct X {};

using ::scl::member_function_like_t;

// No ref-qualifier, no 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-qualified (&), no 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-qualified (&&), no 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 &&>);

// With 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>);

// With arguments retained
static_assert(std::is_same_v<member_function_like_t<X const&, int(short)>, int (X::*)(short) const &>);

Typical Use Cases

See Also


member_property_like_t<Type, Member>

Builds a pointer-to-data-member type for class Type and member type Member, overlaying the object’s cv-qualifiers onto the member type.

Semantics

Examples

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

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

using ::scl::member_property_like_t;

// Object qualifiers overlay onto 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::*>);

// References on Type do not matter for data members
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::*>);

// Member’s own cv is preserved (and overlaid with object’s 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::*>);

Typical Use Cases

See Also


member_like_t<Type, T>

Generic selector that produces a pointer-to-member type for class Type and a descriptor T:

Semantics

Examples

#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;

// Function members
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>);

// Data members
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::*>);

Typical Use Cases

See Also


Notes