2017-09-24 246 views
0

首先,我要感謝大家試圖解決我的這個疑問。我正在致力於將最小的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

回答

0

看來,你需要描述hereoverload 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)); 
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

看起來像蟒蛇在它看來,如果他們是普通的浮點數參數。

但我仍然衷心的感謝和感謝你的時間。

問候,

0K

+0

什麼是'AngleBetween()'?這個函數不在你的代碼示例中。 –

+0

Ooops與我最初詢問的簽名類似。當我寫評論的時候,我正在測試同一個庫,所以在我的終端上。抱歉讓你困惑。 –