Pybind11 - возвращает указатель на контейнер unique_ptr - PullRequest
0 голосов
/ 17 декабря 2018

Я использовал отличную библиотеку pybind11, но попал в кирпичную стену.Мне нужно вернуть Python указатель на не копируемый объект (так как объект содержит unique_ptrs).

Обычно это прекрасно работает с предостережением об использовании return_value_policy :: reference.Однако возвращение указателя на объект с вектором не копируемых результатов приводит к ошибке компиляции.Похоже, что pybind хочет выполнить копирование в этом случае, даже если политика возвращаемых значений является ссылкой, а функция явно возвращает указатель.

Почему это так и есть ли обходной путь?

Я использую VS2017 15.9.2 с последней версией pybind11 off master

#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include <vector>
#include <memory>

/* This fails to compile... */
struct myclass
{
    std::vector<std::unique_ptr<int>> numbers;
};

/* ...but this works
struct myclass
{
    std::unique_ptr<int> number;
};
*/

void test(py::module &m)
{
    py::class_<myclass> pymy(m, "myclass");

    pymy.def_static("make", []() {
        myclass *m = new myclass;
        return m;
    }, py::return_value_policy::reference);
}

1 Ответ

0 голосов
/ 17 декабря 2018

Я с этим разобрался

Конструктор копирования и оператор присваивания должны быть явно удалены, т.е. добавление следующего позволяет pybind распознавать, что не может сделать копию

myclass() = default;
myclass(const myclass &m) = delete;
myclass & operator= (const myclass &) = delete;
...