121template <
typename T,
typename =
void>
125struct Callable<T,
std::void_t<decltype(std::declval<T>()())>> : std::true_type {};
137template <
typename OT,
typename T,
typename =
void>
140template <
typename OT,
typename T>
141struct Assignable<OT, T,
std::void_t<decltype(std::declval<OT&>() = std::declval<T>())>> : std::true_type {};
153template <
typename OT,
typename T,
typename =
void>
156template <
typename OT,
typename T>
157struct EqualityComparable<OT, T,
std::void_t<decltype(std::declval<OT>() == std::declval<T>())>> : std::true_type {};
170template <
typename OT,
typename T,
typename =
void>
173template <
typename OT,
typename T>
176 std::void_t<decltype(std::declval<OT&>() < std::declval<T>()), decltype(std::declval<OT&>() > std::declval<T&>())>>
190template <
typename OT,
typename T,
typename =
void>
193template <
typename OT,
typename T>
195 std::void_t<decltype(std::declval<OT&>() << std::declval<T>()),
196 decltype(std::declval<OT&>() >> std::declval<T&>())>> : std::true_type {};
223template <
typename T,
typename =
void>
228 : std::is_base_of<std::shared_ptr<typename T::element_type>, T> {};
240template <typename T, bool = IsSharedPtr<T>::value>
247 using Type =
typename T::element_type;
265template <
typename T,
typename F>
266[[nodiscard]]
static constexpr auto has_member(F&& f)
noexcept ->
decltype(f(std::declval<T>()),
true) {
272[[nodiscard]]
static constexpr auto has_member(...) noexcept {
286[[nodiscard]]
static constexpr auto is_non_char_ptr() noexcept {
287 return std::is_pointer_v<std::decay_t<T>> &&
288 !std::is_same_v<std::remove_cv_t<std::remove_pointer_t<std::decay_t<T>>>,
char>;
304[[nodiscard]]
static constexpr bool is_integer() {
305 using U = std::remove_cv_t<T>;
306 return std::is_integral_v<U> && !std::is_same_v<U, bool> && !std::is_same_v<U, char> &&
307 !std::is_same_v<U, signed char> && !std::is_same_v<U, unsigned char>;
320[[nodiscard]]
static constexpr bool is_floating() {
321 return std::is_floating_point_v<std::remove_cv_t<T>>;
350#define VLINK_HAS_MEMBER(T, member) \
351 vlink::Traits::has_member<T>([](auto&& obj) -> decltype((void)(obj.member), 0) { return 0; })
Collection of compile-time type-trait helpers for VLink.
Detects whether an object of type OT can be assigned a value of type T.
定义 traits.h:138
Detects whether type T is callable with no arguments.
定义 traits.h:122
An empty tag type used as a neutral placeholder in template meta-programming.
定义 traits.h:95
Detects whether OT supports the == operator with T.
定义 traits.h:154
A type trait that always evaluates to std::false_type.
定义 traits.h:109
Detects whether OT supports both < and > operators with T.
定义 traits.h:171
Detects whether type T is a std::atomic specialization.
定义 traits.h:208
Detects whether type T is a std::shared_ptr specialization.
定义 traits.h:224
Detects whether OT supports << and >> stream operators with T.
定义 traits.h:191
typename T::element_type Type
定义 traits.h:247
Strips std::shared_ptr to obtain the underlying element type.
定义 traits.h:241