在boost :: python中如何包装一个可重写的函数,它接受一个指向C ++对象的指针容器并返回指向其中一个的指针?

时间:2012-12-11 11:00:50

标签: pointers wrapper boost-python

我用boost :: python包装一个C ++框架,我需要在python中重写一个C ++方法。这是一个钩子方法,它是框架所需要的,并且在C ++中有一个默认实现,它迭代一个列表(作为参数传递)并执行选择。出现问题是因为通过返回指向所选元素的指针(实际上是迭代器)来声明选择,但是我找不到一种方法来返回一个python函数的C ++指针。有人可以帮忙吗?

由于

2 个答案:

答案 0 :(得分:0)

这肯定是可行的,但你没有足够的细节。你真正需要做的是创建一个调用你的python函数的c ++函数,执行python结果并返回一个c ++结果。换句话说(假设我有一个名为func的boost object,它指向一个解析字符串并返回一个int的python函数:

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.
}

答案 1 :(得分: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)
    ;

这是你需要的吗?