c++ - 如何使python函数作为c++函数的回调

标签 c++ python 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/

相关文章:

c++ - C中的波浪号运算符

python - 了解反斜杠行为 (Windows)

c++ - 使用 shared_ptr 将 base 抽象为 boost.python 的持有者

python - 使用 boost::python 将虚拟成员函数从 C++ 公开到 Python

c++ - 如何使用 const_iterator 公开 C++ 类

c++ - 写入全局变量的顺序

c++ - 如何使用 boost::call_once 在 Linux 上用 C++ 设计单例类?

c++ - this 和 this@entry 的区别?

python - 如何使用特定源 IP 将 ZeroMQ 连接到 .connect() 到本地主机?

python - 使用 selenium webdriver 限制 phantomjs 的内存使用?