C++ Library Extensions 2022.12.09
To help learn modern C++ programming
17-multiple_packs.cpp
Go to the documentation of this file.
1#include <iostream>
2#include <tuple>
3#include <variant>
4
6auto endl = "\n";
7
8// C++ does not allow multiple variadic parameter packs
9// template<typename... Types_1, typename... Types_2>
10// class multiple_packs
11// {
12
13// };
14
15template<typename... Types>
16struct type_list_t { };
17
18// primary template declaration
19// typename... Types ---> means
20// multiple_packs can take zero or more parameters
21template<typename... Types> class multiple_packs;
22
23template<typename... Types_1, typename... Types_2>
24class multiple_packs< type_list_t<Types_1...>, type_list_t<Types_2...> >
25{
26 public:
27 using tuple_t = std::tuple<Types_1...>;
28 using variant_t = std::variant<Types_2...>;
29
30 public:
33
34};
35
37{
38 using types_for_tuple = type_list_t<int, short>;
39 using types_for_variant = type_list_t<float, double>;
40
42}
43
45{
46 using types_for_tuple = type_list_t<int, short>;
47 using types_for_variant = type_list_t<double, const char*>;
48
50 mp{ {5, 6}, { "Thomas Kim" } };
51
52 auto& [int_value, short_value ] = mp.m_tuple;
53
54 stream <<"int_value = " << int_value << endl;
55 stream <<"short_value = " << short_value << endl;
56
57 std::visit( [](auto& value)
58 {
59 stream << "the value of variant: "
60 << value << endl;
61 }, mp.m_variant);
62
63 mp.m_variant = 22.0 /7.0;
64
65 std::visit( [](auto& value)
66 {
67 stream << "the value of variant: "
68 << value << endl;
69 }, mp.m_variant);
70
71}
72
73int main()
74{
76}
auto & cout
auto & stream
void test_multiple_packs()
auto endl
void how_to_use_multiple_packs()
int main()
enable_if_variant_t< VariantType > visit(VisitorType &&visitor, VariantType &&vt)
Definition: 31-visit.cpp:118