Использование std :: smart_ptr с Pybind11 - PullRequest
0 голосов
/ 17 июня 2020

Я начинаю использовать Pybind11. Я планирую использовать Pybind11 в сложном проекте для раскрытия структур c ++ для python, будет полезно увидеть пример, показывающий, как выставить заполнение из python массива, используя следующие структуры:

template <typename T>
struct point;

template <typename T>
struct quaternion;

template <typename T>
struct point{
T _x, _y, _z;
};

template <typename T>
struct quaternion{
T _a, _b_i, _c_j, _d_k;
};

Рекомендуется использовать указатели std :: shared_ptr. Как использовать std :: smart_ptr с pybind11? Говоря более конкретно, я хочу иметь возможность заполнять массив из python, и после завершения заполнения я хочу иметь возможность передавать диапазон указателей (std :: smart_ptr), указывающих на область массива из python подпрограмме в C ++, чтобы сделать что-то еще с данными. Это может быть указатель на начало, а другой конец блока данных в массиве, сканирование данных с использованием арифметики указателей.

Отказ от ответственности: Я не знаю, может ли Pybin11 по умолчанию использовать std :: shared_ptr под капотом.

1 Ответ

0 голосов
/ 17 июля 2020

Я считаю, что для point, quaternion et c аргумент шаблона типа с плавающей запятой используется для обеспечения требуемой точности. Если в вашей ситуации вышеупомянутые структуры используются для создания псевдонимов, таких как:

using Point = point<float>

Тогда решение простое, вы оборачиваете их следующим образом:

    py::class_<Point>(m, "Point")
            .def(py::init<>())
            .def_property("x", [](const Point& o){ return o._x; }, [](Point& o, float v){ o._x = v;});

Ситуация становится больше сложно, когда в коде C ++ появляются point<float>, point<double> et c. Это два разных типа, и они должны быть упакованы независимо:

template <typename T>
struct point{
    T _x, _y, _z;
};

template<typename T>
void wrap_point(const char* type_name, py::module& m)
{
    py::class_<point<T>>(m, type_name)
            .def(py::init<>())
            .def_property("x", [](const point<T>& o){ return o._x; }, [](point<T>& o, T v){ o._x = v;});
}

PYBIND11_MODULE(example, m) {
    wrap_point<float>("pointf", m);
    wrap_point<double>("pointd", m);
}

Ваш вопрос об использовании shared_ptr, к сожалению, слишком расплывчатый, вы должны быть более конкретными c и дать больше контекста.

...