This library contains some utility stuff for pybind11
Expose a function mo2::python::wrap_arguments and a template
mo2::python::smart_variant that can be used to expose more interesting types Python
than the C++ one, e.g., accept os.PathLike and QFileInfo when a simple QString is
expected.
A toy example can be found in the test folder at
tests/python/test_argument_wrapper.cpp.
More concrete examples can be found in
mobase/pybind11_all.h for FileWrapper and
DirectoryWrapper.
TODO: updated version of <pybind11/functional.h> that should check the signature
a bit more when creating std::function (similar to previous implementation).
Expose a macro MO2_PYBIND11_SHARED_CPP_HOLDER that can be used to declare that
std::shared_ptr<...> must hold-on their associate Python object.
// use the macro on the type to be exposed (with a trampoline class)
MO2_PYBIND11_SHARED_CPP_HOLDER(ISaveGame)
// use std::shared_ptr<> as the holder for the class
py::class_<ISaveGame, PySaveGame, std::shared_ptr<ISaveGame>>(...);Using the MO2_PYBIND11_SHARED_CPP_HOLDER (must be present in all files manipulating
ISaveGame between C++ and Python) ensure that the Python instance remains alive
alongside the C++ one.
The MO2_PYBIND11_SHARED_CPP_HOLDER declares a specialization of type_caster<> that
alters the std::shared_ptr by return a std::shared_ptr<> that owns the Python
object (via a pybind11::object) but does not release the C++ one - The C++ object is
owned by the Python one, so the relation is as follows:
- The
std::shared_ptr<X>manipulated in C++ maintains thepybind11::objectalive through a custom deleter but DOES NOT release the C++ object when the reference count reaches 0. - The Python object holds a standard
std::shared_ptr<X>that will release the object when the reference count reaches 0.