1

Python 用の C++ アプリからいくつかのバインディングを作成しました。

問題は、メンバーへのポインターを使用することです (最短パスを計算し、パラメーターとして最小化するプロパティを与えるためです)。

これは C++ の署名です。

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

これは私がやったことです(私がドキュメントで理解したことから):

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

これは、Python から関数を呼び出す方法です。

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::*)

デフォルトの 4 番目のパラメーターを使用するオーバーロードされたメソッドがあり、完全に機能します。

swigでメンバーへのポインタを使用することは可能ですか? はいの場合、トリックは何ですか?いいえの場合、最もエレガントな方法は何ですか?

ご協力ありがとうございました!

更新: Boost::python が確実にそれを行うかどうかを誰かが知っていれば、それに切り替えます。

4

1 に答える 1

2

SWIGについては知りませんが、boost::pythonではラッパーを書くことができます:

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);
}

Python では次のようにします。

result, v = foomodule.foo(x)

Python では float は不変であるため、実際にメソッドに float を渡して、メソッドが float 値を変更することを期待することはできないため、代わりに値のタプルを返すようにコードを調整します。

于 2010-02-02T18:12:53.613 に答える