我的方法(不是唯一的方法)<>在C++中,我有一个类,它提供了如下方式的回调:struct Mesh {
template
void visitChildren(Visitor& v)
{
[...]
v.visit([...])
}
}
然后将类导出到Python(仍然C++)
^{pr2}$
将访问者本身导出到pythontypedef ChildrenVisitor ClassT;
class_("ChildrenVisitor",
init() );
对于Mesh的导出,您需要.def("visitChildren", &Mesh::template visitChildren )
我总是使用...来插入任何参数。在
在python中,您可以这样做class MyVisitor(ChildrenVisitor):
def __init__(self):
ChildrenVisitor.__init__(self,self)
def visit(self):
# do whatever you want
我还想创建一个ChildrenVisitor的子类,它接受lambda函数,这使得用python编写访问者只需要一行代码。在
哦,BTW。如果你想在稍后的时间调用这个函数,那么你需要把C++实现变成这样的struct ChildrenVisitorBase
{
virtual void visit( /* .... */ ) = 0;
};
struct Mesh {
void registerCallback(shared_ptr v)
{
visitors.push_back(v)
}
void doSomeWork() {
// ...
for(int i=0; i < visitors.size(); ++i)
visitors[i]->visit( /* ... */ )
}
std::vector< shared_ptr > visitors;
}
并使ChildrenVisitor实现ChildrenVisitorBase。在