Ich versuche mal wieder einen Haufen Boilerplate Code für eine
Klassen-interne (De)serialisierung zu vermeiden - der Code steht schon
lange und läuft aber man muss fuer das (De)serialisieren und die
vorhergehende Größen-Brechnung der Serialisierungs-Daten mind. 3 mal die
entsprechende Member angeben - wie gesagt läuft alles, ist mir aber viel
zu umständlich
jetzt hatte ich mir ueberlegt den bestehenden Serialisierer durch einen
kleines Helper-Template zu erweitern bei dem man einmalig die Member
angibt die serialisiert werden sollen und diese Angabe dann an den
calc_size, encode, decode Stellen verwendet wird
Klappt soweit aber ich würde gerne wissen warum der Serializer innerhalb
der Test-Klasse nicht in der Lage ist die Member-Typen automatisch zu
dedukten (Zeile 22), so wie er es in der main kann (Zeile 31)
kann mir das jemand erklären?
gcc-godbolt: https://gcc.godbolt.org/z/PbYb9s
1 | #include <tuple>
|
2 |
|
3 | template <typename... Member>
|
4 | class Serializer
|
5 | {
|
6 | public:
|
7 | Serializer( Member&... ref_ ) : m_refs( ref_... )
|
8 | {
|
9 | }
|
10 |
|
11 | using refs = std::tuple<Member&...>;
|
12 | refs m_refs;
|
13 | };
|
14 |
|
15 | class Test
|
16 | {
|
17 | public:
|
18 | int m_x{};
|
19 | float m_y{};
|
20 |
|
21 | // hier brauche ich noch die typen (oder eben decltype)
|
22 | Serializer<decltype( m_x ), decltype( m_y )> m_serialize{ m_x, m_y };
|
23 | };
|
24 |
|
25 | int main()
|
26 | {
|
27 | Test t;
|
28 | std::get<0>( t.m_serialize.m_refs ) = 23; // schreibt m_x
|
29 |
|
30 | // ausserhalb der Klasse geht das automatische dedukting
|
31 | Serializer s( t.m_x, t.m_y);
|
32 | }
|