Advertisement
Guest User

Untitled

a guest
Sep 28th, 2017
257
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.62 KB | None | 0 0
  1. #include <pybind11/pybind11.h>
  2. #include <functional>
  3. #include <iostream>
  4. namespace py=pybind11;
  5.  
  6. class Animal
  7. {
  8.   public:
  9.     virtual void speak() {std::cout << "I am just a generic animal, I have no voice." << std::endl;}
  10. };
  11.  
  12. class Animal_wrapper
  13. {
  14.   public:
  15.     Animal_wrapper(py::object o) : obj(o) {}
  16.     std::shared_ptr<Animal> operator()() { py::object animal = obj();
  17.                                            return animal.cast< std::shared_ptr<Animal> >();}
  18.     py::object obj;
  19. };
  20.  
  21. class Animal_trampoline : public Animal
  22. {
  23.   public:
  24.     void speak() override { PYBIND11_OVERLOAD(void, Animal, speak, ); }
  25. };
  26.  
  27. class Animal_Factory
  28. {
  29.   public:
  30.     Animal_Factory() = default;
  31.     Animal_Factory(std::function<std::shared_ptr<Animal>()> anm) : factory(anm) {}
  32.     std::function<std::shared_ptr<Animal>()> factory;
  33. };
  34.  
  35. Animal_Factory my_factory;
  36. void set_factory(py::object obj);
  37. std::shared_ptr<Animal> get_animal();
  38.  
  39. PYBIND11_MODULE(example, m)
  40. {
  41.   py::class_<Animal, Animal_trampoline, std::shared_ptr<Animal>>(m, "Animal")
  42.   .def(py::init<>())
  43.   .def("speak", &Animal::speak);
  44.  
  45.   py::class_<Animal_Factory>(m, "Animal_Factory")
  46.   .def(py::init<std::function<std::shared_ptr<Animal>()>>())
  47.   ;
  48.  
  49.   m.def("set_factory", &set_factory, py::arg("f"));
  50.   m.def("get_animal", &get_animal);
  51.  
  52. }
  53.  
  54. void
  55. set_factory(py::object obj)
  56. {
  57.   std::cout << "Setting factory" << std::endl;
  58.   Animal_wrapper const wrap(obj);
  59.   my_factory = Animal_Factory(wrap);
  60. }
  61.  
  62. std::shared_ptr<Animal>
  63. get_animal()
  64. {
  65.   std::cout << "Making new animal from factory" << std::endl;
  66.   return my_factory.factory();
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement