0 Tage Serie
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.