boost-python:如何提供自定义构造函数包装函数?
Posted
技术标签:
【中文标题】boost-python:如何提供自定义构造函数包装函数?【英文标题】:boost-python: How do I provide a custom constructor wrapper function? 【发布时间】:2013-09-13 19:37:41 【问题描述】:我正在使用 boost-python 为名为 CppClass
的 C++ 类创建 python 绑定。必要时,我可以通过预处理参数的小包装函数将调用路由到“普通”成员函数(例如,从 python args 中提取 C++ 类型),如下所示:
class CppClass
public:
CppClass(SpecialParameters p);
void doSomething(int x, float y);
;
using namespace boost::python; // For extract, tuple, init, class_, etc.
class WrapperFuncs
public:
static void doSomething(CppClass & c, tuple t)
// Special extraction: Convert python arg ( a tuple) into C++ args.
int x = extract<int>(t.attr("__getitem__")(0));
float y = extract<float>(t.attr("__getitem__")(1));
c.doSomething(x,y);
;
class_<CppClass, boost::shared_ptr<CppClass> >
("CppClass", init<SpecialParameters>())
.def("doSomething", &WrapperFuncs::doSomething, (arg("t")))
但是我该如何为CppClass
构造函数做同样的事情?
【问题讨论】:
【参考方案1】:使用no_init
后跟.def
代表__init__
使用boost::python::make_constructor()
。
class WrapperFuncs
public:
static boost::shared_ptr<CppClass> initWrapper( object const & p )
SpecialParameters sp = ... // do complicated extraction here.
return boost::shared_ptr<CppClass>( new CppClass(sp) );
static void doSomething(CppClass & c, tuple t) /*...*/
;
class_<CppClass, boost::shared_ptr<CppClass> >
("CppClass", no_init)
.def("__init__", make_constructor(&WrapperFuncs::initWrapper))
.def("doSomething", &WrapperFuncs::doSomething, (arg("t")))
python wiki 的This section 解释了如何做到这一点,但它对我来说并不适用,因为它没有提到no_init
。就我而言,no_init
是必需的。
【讨论】:
以上是关于boost-python:如何提供自定义构造函数包装函数?的主要内容,如果未能解决你的问题,请参考以下文章