🔧advanced
constexpr Virtual Functions
Use polymorphism at compile time
Example Code
cpp
#include <iostream>#include <memory>// Base class with constexpr virtualstruct Shape { constexpr virtual ~Shape() = default; constexpr virtual double area() const = 0; constexpr virtual const char* name() const = 0;};struct Circle : Shape { double radius; constexpr Circle(double r) : radius(r) {} constexpr double area() const override { return 3.14159 * radius * radius; } constexpr const char* name() const override { return "Circle"; }};struct Square : Shape { double side; constexpr Square(double s) : side(s) {} constexpr double area() const override { return side * side; } constexpr const char* name() const override { return "Square"; }};// Compile-time polymorphismconstexpr double total_area(const Shape& s1, const Shape& s2) { return s1.area() + s2.area();}int main() { constexpr Circle c{5.0}; constexpr Square s{4.0}; constexpr double total = total_area(c, s); static_assert(total > 90.0 && total < 100.0); std::cout << c.name() << " area: " << c.area() << std::endl; std::cout << s.name() << " area: " << s.area() << std::endl; std::cout << "Total: " << total << std::endl; return 0;}Explanation
C++20 allows virtual functions to be constexpr, enabling polymorphism at compile time. This opens up new possibilities for type-safe, compile-time computed hierarchies.
Key Points
- 1Virtual functions can be constexpr
- 2Destructors can be constexpr virtual
- 3Enables compile-time polymorphism
- 4Works with references to base class