如何使python函数作为c++函数的回调
How to make a python function as callback of a c++ function
可能重复:
使用boost::python 将回调从python传递到c++
我必须制作一个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
我还喜欢制作一个ChildrenVisitor
的子类,它接受lambda函数,使用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
。
您的问题由这个食谱来回答。
如果您想要作为回调的函数在编译时已经被调用,那么您应该使用PyEval_CallObject(...);
。如果函数必须在运行时定义,请使用配方中显示的方案来接收函数指针。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗