PyBind - 重载函数
PyBind - Overloaded functions
首先感谢大家解答我的疑惑。我正在努力转换一个最小的 C++ 项目以在 Python 中使用。这种努力背后的真正原因是为了速度。
我偶然发现了 PyBind,对其功能及其提供的文档数量感到非常惊讶。现在有一些事情停止了工作,因为我不知道该怎么做。考虑文件“MySource.hpp”中的以下代码,您能告诉我如何完成绑定吗?
struct Point3D
{
public:
double x, y, z;
CPoint3D();
CPoint3D(double x, double y, double z);
inline double Len() const;
inline void Normalize();
};
Point3D VectorCross(const Point3D& pt1, const Point3D& pt2, const Point3D& pt3);
void VectorCross(const float* u, const float* v, float * n);
我能够将 Point3D 的绑定定义为 class 及其某些成员函数。但是我不知道如何绑定重载方法“VectorCross”。它有两种方法,一种接受 Point3D 的实例,另一种接受指向浮点数组的指针。
到目前为止我写的绑定如下所示
PYBIND11_MODULE(mymodule, m)
{
py::class_<Point3D> point3d(m, "Point3D");
point3d.def_readwrite("x", &CPoint3D::x);
point3d.def_readwrite("y", &CPoint3D::y);
point3d.def_readwrite("z", &CPoint3D::z);
point3d.def(py::init<>());
point3d.def(py::init<double , double , double >());
point3d.def("Len", &CPoint3D::Len);
point3d.def("Normalize", &CPoint3D::Normalize);
}
有人可以指导我如何操作吗?
您似乎需要按照 here 中的说明进行操作 overload cast
。
m.def("VectorCross", py::overload_cast<const Point3D&, const Point3D&, const Point3D&>(&VectorCross));
m.def("VectorCross", py::overload_cast<const float*, const float*, float*>(&VectorCross));
罗马,
我明白了这一点,但仍然选择您的答案作为正确答案,因为它确实是答案。但仍然在方法签名的情况下,它期望参数是浮点指针(下行)
m.def("VectorCross", py::overload_cast<const float*, const float*, float*>(&VectorCross));
在创建 python 库时编译良好。但是,当您在导入后尝试从 python 调用方法时,将导致参数错误。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: AngleBetween(): incompatible function arguments. The following argument types are supported:
1. (pt1: chenhancc.CPoint3D, pt2: chenhancc.CPoint3D) -> float
2. (pt1: chenhancc.CPoint3D, pt2: chenhancc.CPoint3D, pt3: chenhancc.CPoint3D) -> float
3. (u: float, v: float) -> float
看起来 python 看起来好像它们是普通的浮点数参数。
但我仍然衷心感谢您的宝贵时间。
此致,
0K
首先感谢大家解答我的疑惑。我正在努力转换一个最小的 C++ 项目以在 Python 中使用。这种努力背后的真正原因是为了速度。
我偶然发现了 PyBind,对其功能及其提供的文档数量感到非常惊讶。现在有一些事情停止了工作,因为我不知道该怎么做。考虑文件“MySource.hpp”中的以下代码,您能告诉我如何完成绑定吗?
struct Point3D
{
public:
double x, y, z;
CPoint3D();
CPoint3D(double x, double y, double z);
inline double Len() const;
inline void Normalize();
};
Point3D VectorCross(const Point3D& pt1, const Point3D& pt2, const Point3D& pt3);
void VectorCross(const float* u, const float* v, float * n);
我能够将 Point3D 的绑定定义为 class 及其某些成员函数。但是我不知道如何绑定重载方法“VectorCross”。它有两种方法,一种接受 Point3D 的实例,另一种接受指向浮点数组的指针。
到目前为止我写的绑定如下所示
PYBIND11_MODULE(mymodule, m)
{
py::class_<Point3D> point3d(m, "Point3D");
point3d.def_readwrite("x", &CPoint3D::x);
point3d.def_readwrite("y", &CPoint3D::y);
point3d.def_readwrite("z", &CPoint3D::z);
point3d.def(py::init<>());
point3d.def(py::init<double , double , double >());
point3d.def("Len", &CPoint3D::Len);
point3d.def("Normalize", &CPoint3D::Normalize);
}
有人可以指导我如何操作吗?
您似乎需要按照 here 中的说明进行操作 overload cast
。
m.def("VectorCross", py::overload_cast<const Point3D&, const Point3D&, const Point3D&>(&VectorCross));
m.def("VectorCross", py::overload_cast<const float*, const float*, float*>(&VectorCross));
罗马,
我明白了这一点,但仍然选择您的答案作为正确答案,因为它确实是答案。但仍然在方法签名的情况下,它期望参数是浮点指针(下行)
m.def("VectorCross", py::overload_cast<const float*, const float*, float*>(&VectorCross));
在创建 python 库时编译良好。但是,当您在导入后尝试从 python 调用方法时,将导致参数错误。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: AngleBetween(): incompatible function arguments. The following argument types are supported:
1. (pt1: chenhancc.CPoint3D, pt2: chenhancc.CPoint3D) -> float
2. (pt1: chenhancc.CPoint3D, pt2: chenhancc.CPoint3D, pt3: chenhancc.CPoint3D) -> float
3. (u: float, v: float) -> float
看起来 python 看起来好像它们是普通的浮点数参数。
但我仍然衷心感谢您的宝贵时间。
此致,