Newer
Older
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#ifndef MEMBERAPPROACH_H
#define MEMBERAPPROACH_H
#include <type_traits>
#include <utility>
template <typename Class, typename ValueType>
class MemberApproach{
public:
virtual ValueType getValue(Class*) = 0;
virtual void setValue(Class*, const ValueType&) = 0;
};
template<typename Class, typename ValueType>
class MemberReference{
public:
template<typename Ref, typename VOID = void>
class Reference{
static_assert (std::is_same<Ref, ValueType Class::*>::value, "The type MemberRef must be reference to member ValueType Class::* or pointer to getter and setter");
public:
Reference(Ref){}
};
template<typename Ref>
class SuperRef: public Reference<Ref, void>{
public:
SuperRef(Ref ref): Reference<Ref, void> (ref){}
};
template<typename Ref>
class Reference<
Ref,
// enable if MemberRef is pointer to member
typename std::enable_if<
std::is_same<Ref, ValueType Class::*>::value
>::type
>
: public MemberApproach<Class, ValueType>{
Ref ref;
public:
Reference(Ref referenceToMember){
ref = referenceToMember;
DBGVAR((std::is_same<Ref, ValueType Class::*>::value));
}
virtual ValueType getValue(Class* c) override {
return c->*ref;
}
virtual void setValue(Class* c, const ValueType& val) override {
c->*ref = val;
}
};
template<typename Ref>
class Reference<
Ref,
// enable if MemberRef is pointer to member
typename std::enable_if<
std::is_same<Ref, ValueType& (Class::*)()>::value
>::type
>
: public MemberApproach<Class, ValueType>{
Ref ref;
public:
Reference(Ref referenceToMember){
ref = referenceToMember;
DBGVAR((std::is_same<Ref, ValueType Class::*>::value));
}
virtual ValueType getValue(Class* c) override {
return (c->*ref)();
}
virtual void setValue(Class* c, const ValueType& val) override {
(c->*ref)() = val;
}
};
template<typename MemberRefGet, typename MemberRefSet>
class Reference<
std::pair<MemberRefGet, MemberRefSet>,
// enable if MemberRef is pointer to member
typename std::enable_if<
std::is_same<MemberRefGet, ValueType (Class::*)()>::value &&
std::is_same<MemberRefSet, void (Class::*)(const ValueType&)>::value
>::type
>
: public MemberApproach<Class, ValueType>{
MemberRefGet refGet;
MemberRefSet refSet;
public:
Reference(std::pair<MemberRefGet, MemberRefSet> getSet){
refGet = getSet.first;
refSet = getSet.second;
}
virtual ValueType getValue(Class* c) override {
return (c->*refGet)();
}
virtual void setValue(Class* c, const ValueType& val) override {
(c->*refSet)(val);
}
};
};
#endif // MEMBERAPPROACH_H