Создание экземпляра класса-оболочки из C ++ - PullRequest
0 голосов
/ 21 января 2019

Я обернул простой интерфейс / класс c ++, используя pybind11

py::class_<IBaseObject, SmartPtr<IBaseObject>>(m, "BaseObject")
    .def(py::init([]()
    {
        return BaseObject_Create();
    }))
)

IBaseObject - это интерфейс, SmartPtr - это пользовательский тип держателя, а BaseObject_Create - фабричная функция, которая возвращает IBaseObject *.

Инсталляция класса из Python работает нормально, однако я также хочу создать экземпляр класса оболочки Python из C ++ при передаче IBaseObject * в качестве параметра.Это возможно?

1 Ответ

0 голосов
/ 08 марта 2019

Если вы просто хотите создать экземпляр своего класса в коде привязки C ++, вы можете использовать pybind s интерфейс Python C ++:

https://pybind11.readthedocs.io/en/stable/advanced/pycpp/object.html#calling-python-functions

Некоторые способы сделать это:

// Option 1: Use your existing class handle.
py::class_<IBaseObject, ...> py_cls(...);
py::object py_obj = py_cls();
// - Cast it if you need to.
auto* obj = py_obj.cast<IBaseObject*>();
// - or cast to `SmartPtr<IBaseObject>()` if its shareable.

// Option 2: Re-import elsewhere in your code.
py::object py_cls = py::module::import("my_pybind_module").attr("IBaseObject");
py::object py_obj = py_cls();
// - etc...

// Option 3: Use `eval` (blech)
py::module m = py::module::import("my_pybind_module");
py::object py_obj = py::eval("IBaseObject()", /* globals */ m.attr("__dict__"));
...