PyBind - 重载函数
首先,我要感谢大家试图解决我的这个疑问。我正在致力于将最小的C++项目转换为在Python中使用。这一努力背后的真正原因是速度。PyBind - 重载函数
我遇到了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定义一个绑定作为一个类和它的某些成员函数。但我不知道如何为超载方法“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);
}
有人可以请指导我如何做到这一点?
问候,
0K
看来,你需要描述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
看起来像蟒蛇在它看来,如果他们是普通的浮点数参数。
但我仍然衷心的感谢和感谢你的时间。
问候,
什么是'AngleBetween()'?这个函数不在你的代码示例中。 –
Ooops与我最初询问的签名类似。当我写评论的时候,我正在测试同一个库,所以在我的终端上。抱歉让你困惑。 –