Я считаю, что для 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 и дать больше контекста.