master
Sergey Marinkevich 5 months ago
commit 765bfc3502

2
.gitignore vendored

@ -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…
Cancel
Save