-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathVariadicTemplate_02_WorkingOnEveryArgument.cpp
More file actions
91 lines (74 loc) · 2.9 KB
/
VariadicTemplate_02_WorkingOnEveryArgument.cpp
File metadata and controls
91 lines (74 loc) · 2.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// =====================================================================================
// VariadicTemplate_02_WorkingOnEveryArgument.cpp // Working on every argument
// =====================================================================================
module modern_cpp:variadic_templates;
namespace VariadicTemplatesWorkingOnEveryArgument {
// ====================================================================
// 1. Beispiel:
// Parameter Pack Expansion mit Hilfe von std::initializer_list
// ====================================================================
template <typename T>
void doSomething(const T& value) {
std::cout << "got value " << value << std::endl;
}
// doesn't compile
//template <typename... TArgs>
//void doSomethingForAll(const TArgs& ... args) {
// doSomething(args)...;
//}
template <typename... TArgs>
void doSomethingForAll(const TArgs& ... args) {
// std::initializer_list<int> list = { (doSomething(args), 0)... };
std::initializer_list<int> { (doSomething(args), 0)... };
}
static void test_01() {
doSomethingForAll(1, '!', std::string{ "ABC" }, 5.5);
std::cout << std::endl;
}
// ====================================================================
// 2. Beispiel:
// C++ 17 constexpr if
// Beispiel mit "Trailing Comma"
// ====================================================================
// ====================================================================
// 1. Variante:
// print-Funktion mit 2 Überladungen
// ====================================================================
static void print() {}
template <typename Head, typename ... Tail>
void print(Head head, Tail ... tail)
{
std::cout << head << ", ";
print(tail ...);
}
static void test_02_01() {
print(1, '!', std::string("ABC"), 5.5);
std::cout << std::endl;
}
// ====================================================================
// 2. Variante:
// print-Funktion in einer Überladung und mit constexpr
// ====================================================================
template <typename Head, typename... Tail>
void printEx(const Head& head, const Tail&... tail) {
std::cout << head;
if constexpr (sizeof...(tail) > 0) {
std::cout << ", ";
printEx(tail...);
}
}
static void test_02_02() {
printEx(1, '!', std::string("ABC"), 5.5);
std::cout << std::endl;
}
}
void main_variadic_templates_working_on_every_argument()
{
using namespace VariadicTemplatesWorkingOnEveryArgument;
test_01();
test_02_01();
test_02_02();
}
// =====================================================================================
// End-of-File
// =====================================================================================