2012-12-05 2 views
6

파이썬에서 C++ 클래스 메서드로 참조로 간단한 호출을하려고합니다.참조 인수로 부스트 파이썬 메서드 호출

내 C++ 코드의 모양처럼 미세한 컴파일

class Foo { 
protected: 
    int _internalVal; 
public: 
    Foo() : _internalVal(5){} 
    void getVal(int& val_io) {val_io = _internalVal;} 
    void getValDoesNothing(int val_io) {val_io = _internalVal;} 
} 

내 부스트 래퍼 코드 :

BOOST_PYTHON_MODULE(libBar) { 
    boost::python::class_<Foo>("Foo") 
    .def("getVal", &Foo::getVal) 
    .def("getValDoesNothing", &Foo::getValDoesNothing); 
} 

나는 다음과 같은 파이썬 전화를 걸 그러나 때

In [1]: import libBar 

In [2]: f = libBar.Foo() 

In [3]: f 
Out[3]: <libBar.Foo at 0x2b483c0> 

In [4]: val = int() 

In [5]: #next command is just to check function signature type 

In [6]: f.getValDoesNothing(val) 

In [7]: f.getVal(val) 
--------------------------------------------------------------------------- 
ArgumentError        Traceback (most recent call last) 
<ipython-input-5-531e4cea97c2> in <module>() 
----> 1 f.getVal(val) 

ArgumentError: Python argument types in 
    Foo.getVal(Foo, int) 
did not match C++ signature: 
    getVal(Foo {lvalue}, int {lvalue}) 

I을 내가 제어 할 수없는 라이브러리로 작업하고있어 값을 반환하기 위해 getVal을 변경하는 것은 옵션이 아닙니다.

마지막 파이썬 명령을 작동시키는 방법이 있습니까?

파이썬 변수를 변경하지 않지만 여전히 함수 호출을 허용하는 픽스를 취할 것입니다.

답변

5

달성하고자하는 것은 Python에서 유효하지 않습니다. 정수는 불변이므로 함수를 간단하게 호출 할 수없고 내용을 변경하기를 기대할 수 없습니다.

int getVal(Foo &foo) { 
    int val_io; 
    foo.getVal(val_io); 
    return val_io; 
}; 

BOOST_PYTHON_MODULE(libBar) { 
    boost::python::def("getVal", getVal); 
    ... 
} 

다음이 방법으로 사용

당신은 당신이 통제하지 않는 라이브러리 사용하고 값을 반환 GETVAL을 변경하고 있기 때문에 당신이 그와 같은 래퍼를 만들 수 있습니다, 옵션을 선택하지 않습니다 :

In [1]: import libBar 

In [2]: f = libBar.Foo() 

In [3]: f 
Out[3]: <libBar.Foo at 0x2b483c0 

In [3]: libBar.getVal(f) 
Out[3]: 5 
-1

getValDoesNothing에서 당신은 int를 전달하고 있습니다. getVal에서 int에 대한 참조를 전달합니다.

나는 이것이 귀하의 문제의 근원이라고 생각합니다.

+0

내가 참조로 전달하고 있음을 알고 있습니다. 내 질문은 어떻게해야합니까? –