Pointers 在boost::python中,如何包装一个可重写函数,该函数接受指向C++;对象并返回指向其中一个对象的指针? 我用C++:一个C++框架,用Python:Python和I需要在Python中创建一个可覆盖的C++方法。这是一个钩子方法,它需要框架,并且在C++中有一个默认实现,它通过列表(作为参数传递)迭代并执行选择。出现问题是因为选择通过返回指向选定元素的指针(实际上是迭代器)来表示,但是由于Python函数,我找不到返回C++指针的方法。有人能帮忙吗

Pointers 在boost::python中,如何包装一个可重写函数,该函数接受指向C++;对象并返回指向其中一个对象的指针? 我用C++:一个C++框架,用Python:Python和I需要在Python中创建一个可覆盖的C++方法。这是一个钩子方法,它需要框架,并且在C++中有一个默认实现,它通过列表(作为参数传递)迭代并执行选择。出现问题是因为选择通过返回指向选定元素的指针(实际上是迭代器)来表示,但是由于Python函数,我找不到返回C++指针的方法。有人能帮忙吗,pointers,wrapper,boost-python,Pointers,Wrapper,Boost Python,谢谢这肯定是可行的,但你没有足够的细节。您真正需要做的是创建一个调用Python函数的C++函数,处理Python结果并返回C++结果。换言之(假设我有一个名为func的boost对象,它指向某个python函数,该函数解析字符串并返回int): 使用boost::python; A*测试(const std::string&foo){ 对象模块=导入(“mymodule”); object func=module.attr(“myfunc”); //或者,可以通过将函数作为参数传递来设置该函数

谢谢

这肯定是可行的,但你没有足够的细节。您真正需要做的是创建一个调用Python函数的C++函数,处理Python结果并返回C++结果。换言之(假设我有一个名为func的boost
对象
,它指向某个python函数,该函数解析字符串并返回int):

使用boost::python;
A*测试(const std::string&foo){
对象模块=导入(“mymodule”);
object func=module.attr(“myfunc”);
//或者,可以通过将函数作为参数传递来设置该函数
//到您包裹的C++函数
对象结果=func(foo);
int val=提取(结果);
返回新的A(val);//假定已包装A。
}
//文件:https://github.com/layzerar/box2d-py/blob/master/python/world.cpp
结构b2ContactFilter\u W:b2ContactFilter,包装器
{
布尔应该碰撞(b2Fixture*fixtureA,b2Fixture*fixtureB)
{
override func=此->获取\u override(“ShouldCollide”);
if(func)
{
return func(ref(fixtureA),ref(fixtureB));//ref是boost::ref
}
返回b2ContactFilter::ShouldCollide(fixtureA,fixtureB);
}
bool应碰撞默认值(b2Fixture*fixtureA、b2Fixture*fixtureB)
{
返回b2ContactFilter::ShouldCollide(fixtureA,fixtureB);
}
};
类(“b2ContactFilter”)
.def(“ShouldCollide”,&b2ContactFilter::ShouldCollide,&b2ContactFilter_W::ShouldCollide默认值)
;
这是你需要的吗

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