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