// Copyright (c) 2018-2025 Jean-Louis Leroy // Distributed under the Boost Software License, Version 1.0. // See accompanying file LICENSE_1_0.txt // or copy at http://www.boost.org/LICENSE_1_0.txt) // clang-format off // tag::ast[] #include #include #include struct Node { virtual ~Node() {} }; struct Literal : Node { explicit Literal(int value) : value(value) {} int value; }; struct Plus : Node { Plus(virtual_ptr left, virtual_ptr right) : left(left), right(right) {} virtual_ptr left, right; }; struct Negate : Node { explicit Negate(virtual_ptr node) : child(node) {} virtual_ptr child; }; BOOST_OPENMETHOD(value, (virtual_ptr), int); BOOST_OPENMETHOD_OVERRIDE(value, (virtual_ptr node), int) { return node->value; } BOOST_OPENMETHOD_OVERRIDE(value, (virtual_ptr node), int) { return value(node->left) + value(node->right); } BOOST_OPENMETHOD_OVERRIDE(value, (virtual_ptr node), int) { return -value(node->child); } BOOST_OPENMETHOD_CLASSES(Node, Literal, Plus, Negate); int main() { boost::openmethod::initialize(); Literal one(1), two(2); Plus sum(one, two); Negate neg(sum); std::cout << value(neg) << "\n"; // -3 return 0; } // end::ast[] int negate(virtual_ptr node) { return -value(node); } #define main alt_main int main() { // tag::final[] Literal one(1); Negate neg(boost::openmethod::final_virtual_ptr(one)); // end::final[] std::cout << value(boost::openmethod::final_virtual_ptr(neg)) << "\n"; // -3 return 0; }