C++ Library Extensions 2022.12.09
To help learn modern C++ programming
25-last_n_types.cpp
Go to the documentation of this file.
1#include <tpf_output.hpp>
2
3namespace types = tpf::types;
4
5template<typename... Types>
7
10
11template<size_t LastN, typename LeftList, typename RightList> struct last_n_types_list_st;
12
13template<>
15{
17};
18
19template<typename LeftType, typename... LeftTypes>
20struct last_n_types_list_st<0, type_list_t<LeftType, LeftTypes...>, type_list_t<>>
21{
23};
24
25template<typename... RightTypes>
26struct last_n_types_list_st<1, type_list_t<>, type_list_t<RightTypes...>>
27{
28 using type = type_list_t<RightTypes...>;
29};
30
31template<typename LeftType, typename... LeftTypes, typename... RightTypes>
32struct last_n_types_list_st<1, type_list_t<LeftType, LeftTypes...>, type_list_t<RightTypes...>>
33{
34 using left_list = type_list_t<LeftType, LeftTypes...>;
35
37};
38
39template<size_t LastN, typename LeftType, typename... LeftTypes, typename... RightTypes>
40struct last_n_types_list_st<LastN, type_list_t<LeftType, LeftTypes...>, type_list_t<RightTypes...>>
41{
42 using left_list = type_list_t<LeftType, LeftTypes...>;
43
46
47 using type_0 = type_list_t<RightTypes...>;
48 using type_1 = std::conditional_t<LastN == 1, new_left,
49 typename last_n_types_list_st<LastN-1, new_left, new_right>::type>;
50
51 using type = std::conditional_t<LastN == 0, type_0, type_1>;
52};
53
54template<size_t LastN, typename... Types>
55using last_n_types_list_t = typename last_n_types_list_st<LastN, Types..., type_list_t<>>::type;
56
57template<size_t LastN, typename... Types>
59{
60 static_assert(LastN <= sizeof...(Types), "LastN out of range");
61
62 using type = typename last_n_types_list_st<LastN, type_list_t<Types...>, type_list_t<>>::type;
63};
64
65template<size_t LastN, typename... Types>
66struct last_n_types_st<LastN, type_list_t<Types...>>
67{
68 static_assert(LastN <= sizeof...(Types), "LastN out of range");
69
70 using type = typename last_n_types_list_st<LastN, type_list_t<Types...>, type_list_t<>>::type;
71};
72
73template<size_t LastN, typename... Types>
74using last_n_types_t = typename last_n_types_st<LastN, Types...>::type;
75
76template<size_t LastN, typename... Types>
77using select_last_n_types_t = last_n_types_t<LastN, Types...>;
78
80{
81 using types_t = type_list_t<short, int, double>;
82 stream <<"Types: " << types_t{} << endl;
83
85 stream <<"t_0_0: " << t_0_0{} << endl;
86
88 stream <<"t_0_1: " << t_0_1{} << endl;
89
91 stream <<"t_0_2: " << t_0_2{} << endl;
92
94 stream <<"t_0_3: " << t_0_3{} << endl;
95
97 stream <<"t_0_4: " << t_0_4{} << endl;
98
99}
100
102{
103 using types_t = type_list_t<short, int, double>;
104 stream <<"Types: " << types_t{} << endl;
105
106 using t_0_0 = last_n_types_t<0, types_t>;
107 stream <<"t_0_0: " << t_0_0{} << endl;
108
109 using t_0_1 = last_n_types_t<1, types_t>;
110 stream <<"t_0_1: " << t_0_1{} << endl;
111
112 using t_0_2 = last_n_types_t<2, types_t>;
113 stream <<"t_0_2: " << t_0_2{} << endl;
114
115 using t_0_3 = last_n_types_t<3, types_t>;
116 stream <<"t_0_3: " << t_0_3{} << endl;
117
118 // using t_0_4 = last_n_types_t<4, types_t>;
119 // stream <<"t_0_4: " << t_0_4{} << endl;
120
121 stream << endl;
122
124 stream <<"t_1_0: " << t_1_0{} << endl;
125
127 stream <<"t_1_1: " << t_1_1{} << endl;
128
130 stream <<"t_1_2: " << t_1_2{} << endl;
131
133 stream <<"t_1_3: " << t_1_3{} << endl;
134
135 // using t_1_4 = last_n_types_t<4, short, int, double>;
136 // stream <<"t_1_4: " << t_1_4{} << endl;
137}
138
139int main()
140{
141 // test_last_n_types_list_t();
142
144}
tpf::sstream stream
typename last_n_types_list_st< LastN, Types..., type_list_t<> >::type last_n_types_list_t
last_n_types_t< LastN, Types... > select_last_n_types_t
auto endl
void test_last_n_types_list_t()
void test_last_n_types_t()
int main()
typename last_n_types_st< LastN, Types... >::type last_n_types_t
Type to string name conversions are defined.
Definition: 31-visit.cpp:7
hidden::pop_back_type_t< Types... > pop_back_type_t
Definition: tpf_types.hpp:5609
constexpr auto endl
Definition: tpf_output.hpp:973
std::conditional_t< LastN==1, new_left, typename last_n_types_list_st< LastN-1, new_left, new_right >::type > type_1
typename last_n_types_list_st< LastN, type_list_t< Types... >, type_list_t<> >::type type
typename last_n_types_list_st< LastN, type_list_t< Types... >, type_list_t<> >::type type
This type is used to manipulate type list.
Definition: tpf_types.hpp:956
Stream output operators << are implemented.