PyBind - 重载函数

Posted

技术标签:

【中文标题】PyBind - 重载函数【英文标题】:PyBind - Overloaded functions 【发布时间】:2018-03-05 10:50:58 【问题描述】:

首先,我感谢你们所有人试图解决我的这个疑问。我正在努力将一个最小的 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 的绑定定义为一个类及其某些成员函数。但我不知道如何为重载方法“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);

有人可以指导我如何做到这一点吗?

【问题讨论】:

【参考方案1】:

您似乎需要按照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));

【讨论】:

【参考方案2】:

罗马,

我想通了,但仍然选择您的答案作为正确的答案,因为它确实是答案。但仍然在方法签名的情况下,它期望参数是浮点指针(下一行)

m.def("VectorCross", py::overload_cast&lt;const float*, const float*, float*&gt;(&amp;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

【讨论】:

什么是AngleBetween()?此函数不在您的代码示例中。 哎呀,它的签名与我最初要求的签名相似。当我写评论时,它就在我的终端上,因为我正在测试同一个库。很抱歉让您感到困惑。 这看起来不像是一个答案;看起来像是对另一个答案的评论。

以上是关于PyBind - 重载函数的主要内容,如果未能解决你的问题,请参考以下文章

类中的函数重载

类中的函数重载

关于C++函数重载问题

[C++]——函数的重载

C++运算符重载中 重载为类的成员函数和重载为类的友元函数 的区别是啥?

Python 没有函数重载?如何用装饰器实现函数重载?