PyBind - 重载函数

时间:2017-09-24 09:51:50

标签: swig boost-python cythonize pybind11

首先,我要感谢你们所有人试图解决我的这个疑问。我正在努力转换一个在Python中使用的最小C ++项目。这项努力背后的真正原因是速度。

我遇到了PyBind,并且对它的功能以及它们提供的文档数量感到非常惊讶。现在有一些东西停止工作,因为我不知道如何做到这一点。请考虑文件“MySource.hpp”中的以下代码,您能否告诉我如何进行绑定?

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<li class="tags" style="cursor: pointer;">
    <a class="link_em" href="?l=1" id="1">List1</a>
</li>

我能够将Point3D的绑定定义为类及其某些成员函数。但是我没有关于如何为重载方法“ VectorCross ”进行绑定的线索。它有两个方法,一个接受Point3D的实例,另一个接受浮点数组的指针。

我到目前为止写的绑定如下所示

    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);

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

此致

0K

2 个答案:

答案 0 :(得分:0)

您似乎需要按here所述的ds.Tables[0].Columns.Add("Codes"); foreach (DataRow row in ds.Tables[0].Rows) { row["Codes"] = string.Join(",", ds.Tables[1] .Select($"SubscriberEligibilityOrBenefitInformation_ID = {row["SubscriberEligibilityOrBenefitInformation_ID"]}") .Select(r=>r["ServiceTypeCode_Text"])); } 进行操作。

overload cast

答案 1 :(得分:0)

罗马,

我认为这一点,但仍然选择你的答案作为正确的答案真的是答案。但仍然在方法签名的情况下,它期望参数是浮点指针(在行下面)

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