Код: Выделить всё
class MyClass
{
void method1();
void method2();
}
PYBIND11_EMBEDDED_MODULE(myModule, m)
{
py::class_(m, "MyPyClass")
.def(py::init())
.def("method1()", &MyClass::method1)
.def("method2()", &MyClass::method2)
}
Код: Выделить всё
void doPython(MyClass* myInstance)
{
py::module_ myModule = py::module_::import("myModule");
py::object myPyInstance = py::cast(myInstance);
... // work with myPyInstance further
}
Есть ли какой-то слабый рабочий процесс с ссылками, который я могу использовать? pybind изначально допускает рабочий процесс unique_ptr илиshared_ptr, но ни один из них не работает в моем случае.
Рабочий процесс настраиваемого интеллектуального указателя звучит многообещающе, и я нашел решение, в котором интеллектуальный указатель удерживал держатель мойЭкземпляр. Я надеялся, что .get() интеллектуального указателя будет вызываться при вызове отдельных методов, позволяя интеллектуальному указателю проверять, активен ли myInstance или нет. Но похоже, что .get() вызывается при вызове cast() и результат сохраняется.
Существует return_value_policy::reference, но он не обрабатывает случай, когда объект удаляется приложением C++, хотя на него все еще ссылается Python, и это критический случай для меня.
Возможно, py:: капсула? но это оказывается слишком многословно
Подробнее здесь: https://stackoverflow.com/questions/792 ... n-pybind11
Мобильная версия