87template<
class...T>
struct type_list_common {
88 static constexpr std::size_t size =
sizeof...(T);
90 template<
template<
class...>
class Templ>
using apply = Templ<T...>;
103template<>
struct type_list<> :
public imp_::type_list_common<> {
107template<
class T1,
class...Ts>
struct type_list<T1, Ts...>
108:
public imp_::type_list_common<T1, Ts...>
111 template<
class, std::
size_t I>
struct get_indexed_type {
112 using type =
typename type_list<Ts...>::indexed_type<I - 1>;
115 template<
class T>
struct get_indexed_type<T, 0> {
120 template<std::
size_t I>
using indexed_type =
typename get_indexed_type<void, I>::type;
125template<std::
size_t I,
class T>
struct get_indexed {};
127template<std::size_t I,
class...T>
struct get_indexed<I,
type_list<T...>> {
128 using type =
typename type_list<T...>::template indexed_type<I>;
131template<std::
size_t I,
class T>
using get_indexed_t =
typename get_indexed<I, T>::type;
134template<
class T>
struct is_type_list :
public std::false_type {};
136template<
class...T>
struct is_type_list<
type_list<T...>> : std::true_type {};
138template<
class T>
static constexpr bool is_type_list_v = is_type_list<T>::value;
141template<
class...T>
static constexpr bool are_type_lists_v = (... && is_type_list_v<T>);
146template<
class...>
struct concatenate_type_lists;
149template<>
struct concatenate_type_lists<> {
150 using type = type_list<>;
154template<
class...T>
struct concatenate_type_lists<
type_list<T...>> {
155 using type = type_list<T...>;
159template<
class T1,
class T2,
class T3,
class...Ts>
struct concatenate_type_lists<T1, T2, T3, Ts...> {
160 static_assert( are_type_lists_v<T1, T2, T3, Ts...> );
161 using type =
typename concatenate_type_lists<
162 typename concatenate_type_lists<T1, T2>::type,
163 typename concatenate_type_lists<T3, Ts...>::type
168template<
class T,
class...Ts>
169struct concatenate_type_lists< T,
type_list<Ts...> >
171 static_assert( is_type_list_v<T> );
172 using type =
typename T::template append<Ts...>;
229template<
class T>
struct get_as_list {
230 using type = type_list<T>;
234template<
class...T>
struct get_as_list<
type_list<T...>> {
235 using type = type_list<T...>;
239template<
class T>
using get_as_list_t =
typename get_as_list<T>::type;
242template<
class T>
struct unwrap {
285template<
class T>
struct flatten<T> {
294template<
class...T>
struct flatten< type_list<T...> > {
295 using type = concatenate_type_lists_t<typename flatten<T>::type...>;
303 using type = type_list<T>;
307template<
class...T>
using flatten_t =
typename flatten<T...>::type;
Converts the template parameters into a type_list.
Definition typelist.hpp:274
Definition typelist.hpp:81
Definition typelist.hpp:214
typename concatenate_type_lists< T... >::type concatenate_type_lists_t
Definition typelist.hpp:200