gpt4 book ai didi

c++ - boost-python:如何提供自定义构造函数包装函数?

转载 作者:可可西里 更新时间:2023-11-01 15:52:06 26 4
gpt4 key购买 nike

我正在使用 boost-python 为名为 CppClass 的 C++ 类创建 python 绑定(bind)。必要时,我可以通过预处理参数的小包装函数将调用路由到“普通”成员函数(例如,从 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 构造函数 做同样的事情呢?

最佳答案

使用 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")))

This section python wiki 解释了如何做到这一点,但它对我来说不太适用,因为它没有提到 no_init。在我的例子中,no_init 是必需的。

关于c++ - boost-python:如何提供自定义构造函数包装函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18793952/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com