2017-09-24 2 views
0

첫째,이 의심을 해결하려는 모든 분들께 감사드립니다. 파이썬에서 사용되는 최소한의 C++ 프로젝트를 변환하려고합니다. 이러한 노력의 근본적인 이유는 속도 때문입니다.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 인스턴스를 받아들이는 메소드와 float 어레이에 대한 포인터를 받아들이는 메소드의 두 가지 메소드를 가지고 있습니다.

는 지금까지 누군가가이 작업을 수행하는 방법에 나를 인도시겠습니까

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

아래와 같습니다 쓴 바인딩? 당신이 here을 설명 overload cast을해야 할 것 같다

0K

답변

0

감사합니다.

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

는 파이썬 라이브러리를 만드는 잘 컴파일합니다. 하지만 당신이 파이썬에서 가져온 후에 메소드를 호출하려고하면, 인수 오류가 발생합니다. 그들은 일반 부동 소수점 숫자 인수가있는 것처럼 파이썬은 그것을 보이는 것처럼

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는 처음에 내가 요청한 것과 비슷한 서명입니다. 내가이 주석을 쓰고있을 때, 같은 라이브러리를 테스트 할 때 터미널에 저기에있었습니다. 죄송합니다. –

관련 문제