Init
commit
765bfc3502
@ -0,0 +1,2 @@
|
|||||||
|
*.o
|
||||||
|
.*.swp
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
run: wrappers
|
||||||
|
./wrappers
|
||||||
|
|
||||||
|
wrappers: main.c
|
||||||
|
g++ -Wall -o wrappers main.c
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o wrappers
|
||||||
@ -0,0 +1,50 @@
|
|||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
struct IShape {
|
||||||
|
virtual void draw() const = 0;
|
||||||
|
virtual ~IShape() = default;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Circle : public IShape {
|
||||||
|
public:
|
||||||
|
void draw() const override {
|
||||||
|
std::cout << "Circle::draw()\n";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class Wrapper {
|
||||||
|
T* impl;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Wrapper(T* obj) : impl(obj) {}
|
||||||
|
|
||||||
|
T* operator->() { return impl; }
|
||||||
|
const T* operator->() const { return impl; }
|
||||||
|
|
||||||
|
operator T*() { return impl; }
|
||||||
|
operator const T*() const { return impl; }
|
||||||
|
|
||||||
|
operator T&() { return *impl; }
|
||||||
|
operator const T&() const { return *impl; }
|
||||||
|
};
|
||||||
|
|
||||||
|
void render_shape_by_ptr(IShape* shape) {
|
||||||
|
shape->draw();
|
||||||
|
}
|
||||||
|
|
||||||
|
void render_shape_by_ref(IShape& shape) {
|
||||||
|
shape.draw();
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
Circle c;
|
||||||
|
Wrapper<IShape> w(&c);
|
||||||
|
|
||||||
|
w->draw();
|
||||||
|
|
||||||
|
render_shape_by_ptr(w);
|
||||||
|
|
||||||
|
render_shape_by_ref(w);
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue