невозможно вернуть shared_ptr из статической функции в pybind11

Я попытался связать статическую функцию, которая возвращает shared_ptr, указывающую на другой класс.

Вот пример кода

class Example {
  public:
    Example() {}
    ~Example() {}
};

class ABC {
  public:
    static std::shared_ptr<Example> get_example() {std::make_shared<Example();}
 };

void init_abc(py::module & m) {
  py::class_<Example>(m, "Example")
    .def(py::init<>());

  py::class_<ABC>(m, "ABC")
    .def_static("get_example", &ABC::get_example);
}

Вот сторона питона

example = my_module.ABC.get_example()

Однако на стороне Python возникла ошибка сегментации.

Есть идеи?


person alec.tu    schedule 07.05.2019    source источник
comment
Я не знаю, поддерживает ли pybind11 shared_ptr или нет, если нет, вы всегда можете попытаться вернуть фактический указатель, используя .get(). Не обязательно имеет значение, возвращаете ли вы shared_ptr или фактическое pointer, когда вы находитесь на стороне Python, потому что shared_ptr в любом случае управляется C++. Я думаю, что использование .get() должно быть безопасным, если это решит проблему.   -  person Amir    schedule 07.05.2019


Ответы (1)


В вашем коде отсутствуют некоторые биты, например >. Вот рабочий пример:

class Example {
public:
    Example() {}
    ~Example() {}
};

class ABC {
public:
    static std::shared_ptr<Example> get_example() { return std::make_shared<Example>();}
};

Затем укажите дополнительный аргумент шаблона shared_ptr<Example> в месте переноса класса Example:

py::class_<Example, std::shared_ptr<Example>>(m, "Example")
    .def(py::init<>());

py::class_<ABC>(m, "ABC")
    .def_static("get_example", &ABC::get_example);

Таким образом, shared_ptr<Example> будет обрабатываться правильно.

person Piotr Barejko    schedule 07.08.2020