<分区>
Possible Duplicate:
pass callback from python to c++ using boost::python
我必须制作一个 python 函数作为 c++ 函数的回调。怎么办?在哪里可以找到一些示例?? 我想使用 boost.python。
<分区>
Possible Duplicate:
pass callback from python to c++ using boost::python
我必须制作一个 python 函数作为 c++ 函数的回调。怎么办?在哪里可以找到一些示例?? 我想使用 boost.python。
最佳答案
我的方法(不是唯一的方法)
在 C++ 中,我有一个以下列方式提供回调的类:
struct Mesh {
template<class Visitor>
void visitChildren(Visitor& v)
{
[...]
v.visit([...])
}
}
然后当我将类导出到 python 时(仍然是 C++)
struct ChildrenVisitor
{
ChildrenVisitor(PyObject* self)
: self(self)
{}
void visit( /* .... */ )
{
call_method<void>(self, "visit" /*, [...] */ );
}
private:
PyObject* self; // 1
};
将访问者本身导出到python
typedef ChildrenVisitor ClassT;
class_<ClassT, boost::noncopyable >("ChildrenVisitor",
init<PyObject*>() );
对于 Mesh
的导出
.def("visitChildren", &Mesh::template visitChildren<ChildrenVisitor> )
我总是使用 ...
,您可以在其中插入任何参数。
在 python 中你做这样的事情
class MyVisitor(ChildrenVisitor):
def __init__(self):
ChildrenVisitor.__init__(self,self)
def visit(self):
# do whatever you want
我还想制作一个接受 lambda 函数的 ChildrenVisitor
的子类,这使得在 python 单行中编写访问者。
哦,顺便说一句。如果您想稍后调用该函数,则需要将 C++ 实现更改为类似这样的内容
struct ChildrenVisitorBase
{
virtual void visit( /* .... */ ) = 0;
};
struct Mesh {
void registerCallback(shared_ptr<ChildrenVisitorBase> v)
{
visitors.push_back(v)
}
void doSomeWork() {
// ...
for(int i=0; i < visitors.size(); ++i)
visitors[i]->visit( /* ... */ )
}
std::vector< shared_ptr<ChildrenVisitorBase> > visitors;
}
并使 ChildrenVisitor
实现 ChildrenVisitorBase
。
关于c++ - 如何使python函数作为c++函数的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12236787/