6

Python から 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);
}

ただし、次の 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 変数を変更せずに関数呼び出しを許可する修正も行います。

4

3 に答える 3

6

あなたが達成しようとしていることは、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
于 2012-12-05T19:04:55.997 に答える
-1

getValDoesNothingでintを渡します。getValでは、intへの参照を渡します。

これがあなたの問題の原因だと思います。

于 2012-12-05T17:11:14.693 に答える