#include using yorel::yomm2::virtual_; class Geometry { public: virtual ~Geometry() {} }; class Arc : public Geometry { public: virtual ~Arc() {} }; class Edge : public Geometry { public: virtual ~Edge() {} }; register_class(Geometry); register_class(Arc, Geometry); register_class(Edge, Geometry); namespace { namespace YoMm2_nS_4 { struct _yOMM2_spec; } } class Painter { public: void paint(const Geometry& geometry); private: int counter = 0; friend struct YoMm2_nS_4::_yOMM2_spec; }; // Implements paint declare_method(void, paintObject, (Painter&, virtual_)); // Catch-all paint(Geometry) define_method(void, paintObject, (Painter& painter, const Geometry& /*geometry*/)) { std::cout << "painting geometry\n"; painter.counter++; } // Specific paint(Arc) define_method(void, paintObject, (Painter& painter, const Arc& arc)) { next(painter, arc); std::cout << " painting arc\n"; } // Specific paint(Edge) define_method(void, paintObject, (Painter& painter, const Edge& edge)) { next(painter, edge); std::cout << " painting edge\n"; } void Painter::paint(const Geometry& geometry) { paintObject(*this, geometry); } int main() { yorel::yomm2::update_methods(); Arc arc; Edge edge; Painter painter; painter.paint(arc); painter.paint(edge); }