Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <pybind11/pybind11.h>
- #include <functional>
- #include <iostream>
- namespace py=pybind11;
- class Animal
- {
- public:
- virtual void speak() {std::cout << "I am just a generic animal, I have no voice." << std::endl;}
- };
- class Animal_wrapper
- {
- public:
- Animal_wrapper(py::object o) : obj(o) {}
- std::shared_ptr<Animal> operator()() { py::object animal = obj();
- return animal.cast< std::shared_ptr<Animal> >();}
- py::object obj;
- };
- class Animal_trampoline : public Animal
- {
- public:
- void speak() override { PYBIND11_OVERLOAD(void, Animal, speak, ); }
- };
- class Animal_Factory
- {
- public:
- Animal_Factory() = default;
- Animal_Factory(std::function<std::shared_ptr<Animal>()> anm) : factory(anm) {}
- std::function<std::shared_ptr<Animal>()> factory;
- };
- Animal_Factory my_factory;
- void set_factory(py::object obj);
- std::shared_ptr<Animal> get_animal();
- PYBIND11_MODULE(example, m)
- {
- py::class_<Animal, Animal_trampoline, std::shared_ptr<Animal>>(m, "Animal")
- .def(py::init<>())
- .def("speak", &Animal::speak);
- py::class_<Animal_Factory>(m, "Animal_Factory")
- .def(py::init<std::function<std::shared_ptr<Animal>()>>())
- ;
- m.def("set_factory", &set_factory, py::arg("f"));
- m.def("get_animal", &get_animal);
- }
- void
- set_factory(py::object obj)
- {
- std::cout << "Setting factory" << std::endl;
- Animal_wrapper const wrap(obj);
- my_factory = Animal_Factory(wrap);
- }
- std::shared_ptr<Animal>
- get_animal()
- {
- std::cout << "Making new animal from factory" << std::endl;
- return my_factory.factory();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement