2012-12-05 17 views
6

PythonからC++クラスメソッドへの参照によって簡単な呼び出しをしようとしています。参照引数を使って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); 
} 

しかし、私は、次のPythonの呼び出しを行うとき:

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では無効です。整数は不変なので、関数を単純に呼び出すことはできず、その内容を変更することはできません。

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

私は参考にしています。私の質問は私がそれをどうやって行うのだろうか? –

関連する問題