cpp / expert
Snippet
Einschränken von Klassenvorlagen mit C++20-Concepts
Die Verwendung von C++20 concept-Deklarationen zur Einschränkung von Class-Templates erzwingt strikte Typanforderungen zur Kompilierzeit mit klaren Fehlermeldungen. Anstelle uneingeschränkter Templates oder komplexem SFINAE etablieren Concepts explizite Schnittstellenverträge für Template-Argumente.
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
28
29
30
31
32
#include <iostream>#include <concepts>#include <string>template <typename T>concept Serialisable = requires(const T& obj) {{ obj.serialize() } -> std::same_as<std::string>;};template <Serialisable T>class DataExporter {public:explicit DataExporter(T data) : data_(std::move(data)) {}void export_data() const {std::cout << "Exporting payload: " << data_.serialize() << '\n';}private:T data_;};struct UserRecord {std::string name;std::string serialize() const { return "UserRecord{name: " + name + "}"; }};int main() {UserRecord user{"Alice"};DataExporter<UserRecord> exporter(user);exporter.export_data();}
Erklärung
1
concept Serialisable = requires(const T& obj)
Prüft zur Kompilierzeit, ob serialize() einen std::string zurückgibt.
2
template <Serialisable T> class DataExporter
Schränkt den Class-Template-Parameter direkt bei der Deklaration ein.
3
DataExporter<UserRecord> exporter(user);
Instanziiert Class-Template, das gegen den Concept-Vertrag validiert wurde.