0

C++ フレームワークを boost::python でラップしており、Python で C++ メソッドをオーバーライド可能にする必要があります。これは、フレームワークで必要とされるフック メソッドであり、C++ で既定の実装があり、リスト (パラメーターとして渡される) を反復処理し、選択を実行します。問題が発生するのは、選択した要素 (実際にはイテレータ) へのポインターを返すことによって選択が示されているためですが、python 関数の結果として C++ ポインターを返す方法が見つかりません。誰でも助けることができますか?

ありがとう

4

2 に答える 2

0
// file: https://github.com/layzerar/box2d-py/blob/master/python/world.cpp
struct b2ContactFilter_W: b2ContactFilter, wrapper<b2ContactFilter>
{
    bool ShouldCollide(b2Fixture* fixtureA, b2Fixture* fixtureB)
    {
        override func = this->get_override("ShouldCollide");
        if (func)
        {
            return func(ref(fixtureA), ref(fixtureB)); //ref is boost::ref
        }
        return b2ContactFilter::ShouldCollide(fixtureA, fixtureB);
    }

    bool ShouldCollideDefault(b2Fixture* fixtureA, b2Fixture* fixtureB)
    {
        return b2ContactFilter::ShouldCollide(fixtureA, fixtureB);
    }
};

class_<b2ContactFilter_W, boost::noncopyable>("b2ContactFilter")
        .def("ShouldCollide", &b2ContactFilter::ShouldCollide, &b2ContactFilter_W::ShouldCollideDefault)
    ;

これはあなたが必要とするものですか?

于 2012-12-21T06:03:19.087 に答える
0

これは間違いなく実行可能ですが、実際には十分な詳細がありません。本当に必要なのは、Python 関数を呼び出し、Python の結果を処理して C++ の結果を返す C++ 関数を作成することです。言い換えると (object文字列を解析して int を返す Python 関数を指す func というブーストがあるとします):

using boost::python;
A* test(const std::string &foo) {
    object module = import("mymodule");
    object func = module.attr("myfunc");
    // alternatively, you could set the function by passing it as an argument
    // to a c++ function that you have wrapped

    object result = func(foo);
    int val = extract<int>(result);
    return new A(val); // Assumes that you've wrapped A.
}
于 2012-12-17T05:05:18.943 に答える