2012-12-05 85 views
6

我想通過引用從python到C++類方法做一個簡單的調用。boost python方法調用引用參數

我的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}) 

我我在圖書館工作,我無法控制如此改變的getVal返回值不是一個選項。

有什麼辦法讓最後的Python命令有效嗎?

我甚至會採取一種不會改變Python變量但仍然允許函數調用的修復方法。

回答

5

你試圖實現的是在Python中無效。整數是不可變的,所以你不能簡單地調用一個函數,並希望它會改變它的內容。

既然你與你別管庫工作,改變GETVAL返回值是不是一種選擇,你可以創建這樣的一個包裝:

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

BOOST_PYTHON_MODULE(libBar) { 
    boost::python::def("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

我知道我通過參考。我的問題是我該怎麼做? –