cpp / expert
Snippet
Constexpr Virtuelle Funktionen für Kompilierzeit-Klassenhierarchien
Seit C++20 erlauben constexpr virtuelle Funktionen die vollständige Auswertung von dynamischen Funktionsaufrufen (Virtual Dispatch) während der Kompilierung, sofern Objekte in einem Constant Expression Kontext erzeugt werden. Dies verbindet objektorientiertes Design direkt mit Compile-Time-Metaprogrammierung.
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
33
34
35
36
#include <iostream>class Shape {public:constexpr virtual double area() const = 0;constexpr virtual ~Shape() = default;};class Rectangle : public Shape {public:constexpr Rectangle(double w, double h) : width_(w), height_(h) {}constexpr double area() const override { return width_ * height_; }private:double width_, height_;};class Circle : public Shape {public:constexpr explicit Circle(double r) : radius_(r) {}constexpr double area() const override { return 3.141592653589793 * radius_ * radius_; }private:double radius_;};constexpr double total_area(const Shape& s1, const Shape& s2) {return s1.area() + s2.area();}int main() {constexpr Rectangle rect(4.0, 5.0);constexpr Circle circ(3.0);constexpr double combined = total_area(rect, circ);static_assert(combined > 48.0 && combined < 49.0, "Compile-time calculation failed");std::cout << "Compile-time evaluated dynamic area: " << combined << '\n';}
Erklärung
1
constexpr virtual double area() const = 0;
Deklariert virtuelle Funktion, die zur Kompilierzeit evaluiert werden kann.
2
constexpr double combined = total_area(rect, circ);
Führt dynamischen Aufruf innerhalb eines constexpr-Ausdrucks aus.
3
static_assert(combined > 48.0 && combined < 49.0, "...");
Prüft das Ergebnis der polymorphen Berechnung statisch während des Kompilierens.