0 Tage Serie
cpp / expert
Snippet

Type-Erasure-Muster für polymorphe Wertsemantik

Das Type-Erasure-Muster kombiniert Template-Konstruktoren mit interner Vererbung (Concept und Model), um Ententypsysteme (Duck Typing) ohne Template-Argumente in der öffentlichen Schnittstelle bereitzustellen. Es ermöglicht nicht-intrusive Laufzeitpolymorphie für nicht-verwandte Typen mit impliziter Schnittstelle.

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
#include <iostream>
#include <memory>
#include <string>
class Printable {
public:
template <typename T>
Printable(T val) : concept_(std::make_unique<Model<T>>(std::move(val))) {}
void print() const { concept_->print_impl(); }
private:
struct Concept {
virtual ~Concept() = default;
virtual void print_impl() const = 0;
};
template <typename T>
struct Model final : Concept {
Model(T val) : value_(std::move(val)) {}
void print_impl() const override { std::cout << value_ << '\n'; }
T value_;
};
std::unique_ptr<Concept> concept_;
};
int main() {
Printable p1(100);
Printable p2(std::string("Type Erasure in Action"));
p1.print();
p2.print();
}
Erklärung
1
template <typename T> Printable(T val)
Template-Konstruktor akzeptiert jeden Typen, der die Druck-Operation unterstützt.
2
struct Concept
Private abstrakte Schnittstelle definiert den internen polymorphen Vertrag.
3
template <typename T> struct Model final : Concept
Konkrete Template-Klasse kapselt den ursprünglichen Wert-Typen.