#include 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 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 w(&c); w->draw(); render_shape_by_ptr(w); render_shape_by_ref(w); }