-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhdeb.h
More file actions
84 lines (69 loc) · 1.74 KB
/
hdeb.h
File metadata and controls
84 lines (69 loc) · 1.74 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
#pragma once
#include <iostream>
#include <string>
#include <type_traits>
#include "int.h"
template <class...>
struct type_list;
template <class>
struct static_head;
template <class T, class ... Q>
struct static_head<type_list<T, Q...>> {
using type = T;
};
template <class TL>
using static_head_t = typename static_head<TL>::type;
template <template <class, class> class F, class Init, class TList>
struct static_accumulate;
template <template <class, class> class F, class Init, class TL>
using static_accumulate_t = typename static_accumulate<F, Init, TL>::type;
template <template <class, class> class F, class Init, class T, class ... Q>
struct static_accumulate<F, Init, type_list<T, Q...>> {
using type =
typename F<T, static_accumulate_t<F, Init, type_list<Q...>>>::type;
};
template <template <class, class> class F, class Init, class T>
struct static_accumulate<F, Init, type_list<T>> {
using type = typename F<T, Init>::type;
};
template <class TList>
struct static_for_each;
template <class T, class ... Q>
struct static_for_each<type_list<T, Q...>> {
template <class Op>
static void execute(Op oper) {
oper.template execute<T>();
static_for_each<type_list<Q...>>::execute(oper);
}
};
template <>
struct static_for_each<type_list<>> {
template <class Op>
static void execute(Op) {
}
};
class afficher_nom
{
std::ostream &os;
public:
afficher_nom(std::ostream &os) : os{ os } {
}
template <class T>
void execute() {
os << typeid(T).name() << std::endl;
}
};
struct afficher_valeur {
std::ostream &os;
afficher_valeur(std::ostream &os) : os{ os } {
}
template <class T>
void execute() {
if constexpr(is_int_<T>::value) {
os << std::to_string(T::value) << std::endl;
}
else {
os << T::value << std::endl;
}
}
};