Boost.Python:从C++调用虚函数
我并不是想要了解如何将虚函数暴露给Python,我想知道如何从C++这边调用这些虚函数。想象一下这个情况……
// ====================
// C++ code
// --------------------
struct Base
{
virtual void func() {
cout << "Hello from C++!";
}
};
BOOST_PYTHON_MODULE(name)
{
// Expose the class and its virtual function here
}
// ====================
// Python code
// --------------------
from name import Base
class Deriv(Base):
def func():
print('Hello from Python!')
有没有什么建议,能让我获取一个指向派生类型的Base*
,这样当我执行base->func()
时,就能调用到Python中的函数?Boost的文档只讲了如何将虚函数暴露给Python,而没有说明如何从C++调用它们的重定义。
2 个回答
0
我觉得你只需要调用 extract<Base*>(obj)
,其中 obj
是一个 python::object
对象。
0
你的方法不能这么简单地使用;你需要给你的Python类加一个包装,这样Python类才能从这个包装中派生出来。在这里,我简单解释了一下它是怎么工作的。所以,要调用C++虚方法的Python重写版本,可以使用 get_override
,然后用 ()
调用返回的对象。
想看一些代码,可以参考这里,在这里定义了 Predicate
和 PredicateWrap
,然后 PredicateWrap
被真正暴露给Python;调用重写的方法是在这里完成的,但这对用户来说是隐藏的。