2009-11-20 4 views
1

파이썬 용 C++ 애플리케이션에서 바인딩을 만들었습니다.swig (또는 Boost :: Python)의 멤버에 대한 포인터

문제점은 멤버에 대한 포인터를 사용한다는 것입니다 (최단 경로 계산 및 매개 변수로 최소화하기위한 속성 제공).

이것은 C++ 서명됩니다 :

std::vector<Path> martins(int start, int dest, MultimodalGraph & g, float Edge::*) 

이 (필자는 문서에서 이해 무엇에서) 내가 한 것입니다 :

%constant float Edge::* distance = &Edge::distance; 

이것은 내가 파이썬에서 내 함수를 호출하는 방법입니다

foo.martins(0, 1000, g, foo.distance) 

그리고 이것은 오류가 나는 얻을 :

NotImplementedError: Wrong number of arguments for overloaded function 'martins'. 
Possible C/C++ prototypes are: 
martins(int,int,MultimodalGraph &,float Edge::*) 

기본 4th 파라 매터를 사용하는 오버로드 된 메서드가 있으며 완벽하게 작동합니다.

그래서 swig를 사용하는 멤버에 대한 포인터를 사용할 수 있습니까? 그렇다면 트릭이란 무엇입니까? 없다면, arround를 작동시키는 가장 우아한 방법은 무엇입니까?

도움 주셔서 감사합니다.

업데이트 : 누군가가 Boost :: python을 확실히 알고 있다면, 나는 그것을 바꿀 것입니다.

답변

2

은 SWIG에 대해 알고 있지만, 부스트 :: 당신이 래퍼 쓸 수 있습니다 파이썬하지 마십시오

bool foo(int x, float* result); 

boost::python::tuple foo_wrapper(int x) 
{ 
    float v; 
    bool result = foo(x, &v); 
    return boost::python::make_tuple(result, v); 
} 

BOOST_PYTHON_MODULE(foomodule) 
{ 
    def("foo", &foo_wrapper); 
} 

를 파이썬에서 당신은 것 :

result, v = foomodule.foo(x) 

파이썬 수레에 이후는 불변, 실제로 메소드에 전달할 수없고 메소드가 부동 소수점 값을 변경할 것으로 예상 할 수 없으므로 코드 대신 값의 튜플을 반환합니다.

+0

답변 해 주셔서 감사합니다. 하지만이 방법을 사용하면 변수에 대한 참조 만 전달하면됩니다. 클래스 멤버에 대한 포인터를 전달하려고합니다. 인스턴스 멤버가 아닙니다. 나는 C 클래스 {int a; int b;}; 그리고 함수 foo (C c, & int C :: *) 다음 함수는 멤버를 사용하는 경우에 따라 foo (c, & C :: a) 또는 foo (c, & C :: b)를 호출 할 수 있습니다. a 또는 인스턴스 c의 클래스 C의 b 멤버. –

+0

이 경우 래핑하는 동안 C 인스턴스가 필요하므로 메서드를 래핑 할 수있는 방법을 알지 못합니다. 반원에게 포인터가 정말로 필요합니까? 대신 int &를 수신하도록 디자인을 변경할 수 있습니까? –

+0

그게 내가 한거야. 그러나 나는 만족하지 않는다. 큰 아이디어는 다양한 비용으로 그래프를 만드는 것입니다. 매개 변수로 전달 된 비용으로 알고리즘을 실행하고 싶습니다. 모든 에지에 대해 알고리즘은 매개 변수에 따라 좋은 변수를 선택합니다. 나는 너무 야심적이었다고 생각한다. 대부분의 python은 너무 낮은 레벨이며 템플릿 및 멤버 포인터가있는 C++를 제공하는 추상화를 허용하지 않습니다. 나는 여전히 대답을 수락합니다. 노력 주셔서 감사합니다 :) –