cpp / expert
Snippet
Semantische Template-Beschränkungen mittels Concepts
C++20 Concepts bieten eine Möglichkeit, Template-Parameter mit klaren Anforderungen einzuschränken. Im Gegensatz zu SFINAE erzeugen Concepts lesbare Fehlermeldungen und ermöglichen es dem Compiler, semantisch über Typen zu urteilen, was sowohl die Wartbarkeit als auch die Kompiliergeschwindigkeit verbessert.
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
#include <iostream>#include <concepts>template<typename T>concept Numeric = std::integral<T> || std::floating_point<T>;template<Numeric T>T add(T a, T b) {return a + b;}// Specific constraint for types with a 'draw' methodtemplate<typename T>concept Drawable = requires(T v) {{ v.draw() } -> std::same_as<void>;};struct Circle { void draw() {} };void render(Drawable auto obj) {obj.draw();}int main() {std::cout << add(5, 10) << std::endl;render(Circle{});// add("error", "error"); // Compile-time error: constraint not metreturn 0;}
Erklärung
1
concept Numeric = std::integral<T> || std::floating_point<T>;
Definiert eine wiederverwendbare Anforderung, dass ein Typ eine Zahl sein muss.
2
template<Numeric T>
Wendet die Beschränkung auf das Template an; Typen, die 'Numeric' nicht erfüllen, führen frühzeitig zu einem Kompilierfehler.