Pybind11 - Возвращает указатель на контейнер unique_ptr

Я использовал отличную библиотеку 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);
}

person AdrianH    schedule 16.12.2018    source источник


Ответы (1)


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

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

myclass() = default;
myclass(const myclass &m) = delete;
myclass & operator= (const myclass &) = delete;
person AdrianH    schedule 16.12.2018