NSUNI/NSLAR Library a250670
Loading...
Searching...
No Matches
trait.hpp
Go to the documentation of this file.
1
6#pragma once
7
8#include <iterator>
9#include <type_traits>
10namespace nnl {
15namespace utl::trait {
22template <typename... Ts>
23struct make_void {
24 typedef void type;
25};
31template <typename... Ts>
32using void_t = typename make_void<Ts...>::type;
33
34template <typename T, typename = void>
35struct has_data_member : std::false_type {};
36
37template <typename T>
38struct has_data_member<T, utl::trait::void_t<decltype(std::declval<T>().data())>> : std::true_type {};
44template <typename T>
45constexpr bool has_data_member_v = has_data_member<T>::value;
46
47template <typename T, typename = void>
48struct has_size_member : std::false_type {};
49
50template <typename T>
51struct has_size_member<T, utl::trait::void_t<decltype(std::declval<T>().size())>> : std::true_type {};
57template <typename T>
58constexpr bool has_size_member_v = has_size_member<T>::value;
59
60template <typename T, typename = void>
61struct has_resize_member : std::false_type {};
62
63template <typename T>
64struct has_resize_member<T, utl::trait::void_t<decltype(std::declval<T>().resize(0))>> : std::true_type {};
70template <typename T>
71constexpr bool has_resize_member_v = has_resize_member<T>::value;
72
73template <typename, typename = void>
74struct has_value_type : std::false_type {};
75
76template <typename T>
77struct has_value_type<T, utl::trait::void_t<typename T::value_type>> : std::true_type {};
83template <typename T>
84constexpr bool has_value_type_v = has_value_type<T>::value;
85
86template <typename T, typename = void>
87struct is_iterable : std::false_type {};
88
89template <typename T>
90struct is_iterable<T, std::void_t<decltype(std::begin(std::declval<T&>())), decltype(std::end(std::declval<T&>()))>>
91 : std::true_type {};
98template <typename T>
99constexpr bool is_iterable_v = is_iterable<T>::value;
106template <typename T>
114template <typename T>
116
118} // namespace utl::trait
119} // namespace nnl
constexpr bool has_resize_member_v
Type trait to detect if a type T has a resize() member function.
Definition trait.hpp:71
constexpr bool has_data_member_v
Type trait to detect if a type T has a data() member function.
Definition trait.hpp:45
constexpr bool is_non_contiguous_v
Type trait to check if a type T represents a non-contiguous range.
Definition trait.hpp:115
constexpr bool has_size_member_v
Type trait to detect if a type T has a size() member function.
Definition trait.hpp:58
constexpr bool is_contiguous_v
Type trait to check if a type T represents a contiguous range.
Definition trait.hpp:107
constexpr bool is_iterable_v
Type trait to check if a type T is iterable.
Definition trait.hpp:99
constexpr bool has_value_type_v
Type trait to detect if a type T defines a nested value_type.
Definition trait.hpp:84
typename make_void< Ts... >::type void_t
A type trait similar to std::void_t that allows for discarding overloads using SFINAE.
Definition trait.hpp:32
Provides additional type trait utilities.
Definition trait.hpp:15
Definition exception.hpp:56