// 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) #include #include #include struct Animal { virtual ~Animal() = default; }; struct Cat : Animal {}; struct Dog : Animal {}; struct Bulldog : Dog {}; using namespace boost::openmethod; // tag::method[] #include class BOOST_OPENMETHOD_NAME(poke); using poke = method< BOOST_OPENMETHOD_NAME(poke)(std::ostream&, virtual_ptr), void>; // end::method[] // tag::poke_cat[] auto poke_cat(std::ostream& os, virtual_ptr cat) { os << "hiss"; } static poke::override override_poke_cat; // end::poke_cat[] // tag::poke_dog[] #include auto poke_dog(std::ostream& os, virtual_ptr dog) { os << "bark"; } BOOST_OPENMETHOD_REGISTER(poke::override); // end::poke_dog[] // tag::poke_bulldog[] auto poke_bulldog(std::ostream& os, virtual_ptr dog) -> void { poke::next(os, dog); os << " and bite"; } BOOST_OPENMETHOD_REGISTER(poke::override); // end::poke_bulldog[] class BOOST_OPENMETHOD_NAME(pet); auto pet_cat(std::ostream& os, virtual_ptr cat) { os << "purr"; } auto pet_dog(std::ostream& os, virtual_ptr dog) { os << "wag tail"; } using pet = method< BOOST_OPENMETHOD_NAME(pet)(std::ostream&, virtual_ptr), void>; BOOST_OPENMETHOD_REGISTER(pet::override); // tag::use_classes[] BOOST_OPENMETHOD_REGISTER(use_classes); // end::use_classes[] // tag::main[] int main() { boost::openmethod::initialize(); std::unique_ptr a(new Cat); std::unique_ptr b(new Dog); std::unique_ptr c(new Bulldog); poke::fn(std::cout, *a); // prints "hiss" std::cout << "\n"; poke::fn(std::cout, *b); // prints "bark" std::cout << "\n"; poke::fn(std::cout, *c); // prints "bark and bite" std::cout << "\n"; // end::main[] pet::fn(std::cout, *a); // prints "purr" std::cout << "\n"; // tag::main[] return 0; // end::main[] }