2016-04-25 37 views
1

在加速Python,可以暴露C++类到Python这样的:在事实之后将成员函数添加到Boost Python类中?

object obj = class_<MyClass>("MyClass") 
    .def("SomeFunc", &MyClass::SomeFunc) 
    ; 

假设MyClass的也有一个功能SomeOtherFunc。有没有办法在稍后的BOOST_PYTHON_MODULE代码中将SomeOtherFunc公开给Python?我尝试使用返回的对象,但它没有属性def。我也尝试再次实例化MyClass的暴露,但是它只覆盖了第一个。基本上我正在寻找这样的事情:

obj.def("SomeOtherFunc", &MyClass::SomeOtherFunc) 

,我试图解决更大的问题是,我有很多的,从一个模板基类继承的类,我试图找到一种以干净的方式将它们暴露给Python的方法。到目前为止,我已经创建了一个模板函数,它接受类和它的模板参数并构造必要的class_call,但是我可能希望稍后修改暴露的类的定义,所以我不知道该怎么做。

如果某人能够准确解释“def”正在做什么以及为什么我不需要逗号之间的逗号,那么可以获得奖励积分。

回答

2

obj没有一个名为def的成员函数,但class_没有。 class_继承自object,这就是为什么这个赋值有效,但你不要这样做。以下工作正常:

auto obj = class_<MyClass>("MyClass") 
    .def("SomeFunc", &MyClass::SomeFunc) 
; 

// now obj is an instance of py::class_<MyClass> instead of py::object 
obj.def("SomeOtherFunc", &MyClass::SomeOtherFunc); 

,你从来没有命名class_实例可以从这样的事实,这是一个简单的构造分散的事实。您也可以将上面的内容写为:

class_<MyClass> obj("MyClass"); 
obj.def("SomeFunc", &MyClass::SomeFunc); 
obj.def("SomeOtherFunc", &MyClass::SomeOtherFunc); 

您不必一次性定义所有内容。

如果某人能够准确解释def正在做什么以及为什么我不需要逗号之间的逗号,那么可以获得奖励积分。

def是类模板class_上的成员函数。它有一个bunch of overloads,所有这些都返回到自己的引用:

template <class Init>   class_& def(Init); 
template <class F>   class_& def(char const*, Fn); 
template <class Fn, class A1> class_& def(char const*, Fn, A1); 
// etc. 

这就是为什么你可以把它们连。每个调用独立设置内部机制以将该函数暴露给python,并且仅返回*this。我不知道你会需要什么逗号。

+0

啊,水的部分和底部是清晰的!谢谢你的解释。其实我早就尝试过使用auto,但它对我来说并不适用。回想起来,我现在意识到我正在用我的函数的输出使用它,它返回了一个“对象”,难怪它没有奏效。我觉得我现在对Boost Python有了更清晰的理解,谢谢! – Nickolai