0 Tage Serie
cpp / expert
Snippet

Zerlegung von Objekten mit benutzerdefinierten strukturierten Bindungen

Strukturierte Bindungen ermöglichen es Ihnen, Objekte in separate Variablen zu entpacken. Für benutzerdefinierte Typen müssen Sie 'std::tuple_size' und 'std::tuple_element' spezialisieren und eine 'get'-Funktion bereitstellen. Dies ermöglicht eine saubere, lesbare Syntax für komplexe Datenstrukturen.

snippet.cpp
cpp
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
#include <iostream>
#include <string>
#include <tuple>
struct Player {
std::string name;
int score;
};
namespace std {
template<> struct tuple_size<Player> : integral_constant<size_t, 2> {};
template<> struct tuple_element<0, Player> { using type = std::string; };
template<> struct tuple_element<1, Player> { using type = int; };
}
template<size_t I> auto& get(Player& p) {
if constexpr (I == 0) return p.name;
else if constexpr (I == 1) return p.score;
}
int main() {
Player p{"Alice", 100};
auto& [n, s] = p; // Structured binding
s += 50;
std::cout << p.name << ": " << p.score << std::endl;
return 0;
}
Erklärung
1
auto& [n, s] = p;
Bindet die Variablen 'n' und 's' per Referenz direkt an die Member von 'p'.
2
if constexpr (I == 0)
Bedingung zur Kompilierzeit, um das richtige Member während der Template-Instanziierung auszuwählen.