2017-09-24 33 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のインスタンスを受け入れるメソッドと、浮動配列へのポインタを受け入れるメソッドの2つがあります。

私がこれまで

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

ローマ、

私はこれを考え出したが、それについて正しいものは本当に答えであるとして、まだあなたの答えを選択します。しかし、まだ、それは(ライン以下)の引数がfloat型のポインタであることを期待メソッドシグネチャの場合は

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

+0

'AngleBetweenは()'は何ですか?この関数はコード例ではありません。 –

+0

私は最初に尋ねたものと似た署名をしています。私がコメントを書いていたとき、私は同じライブラリをテストしていたので、それは私の端末上にありました。あなたを混乱させて申し訳ありません。 –

関連する問題