gpt4 book ai didi

c++ - boost.python 对类似的构造函数感到困惑

转载 作者:太空狗 更新时间:2023-10-29 22:16:48 27 4
gpt4 key购买 nike

我有一个类看起来像

class Foo{
Foo();
Foo(int i);
Foo(bool b);
Foo(double d);
};

然后我像往常一样将我的类(class)暴露给 python

class_<Foo>("Foo")
.def(init<int>())
.def(init<bool>())
.def(init<double>());

当我尝试在 python 中使用 to 时,python 代码总是将 c'tor 参数转换为 double(它始终是类 def 导出中的最后一个)。有没有办法显式告诉 boost.python 如何按类型显式处理?

最佳答案

好吧,你可以改变构造函数定义的顺序,最后一个的优先级更高。这是我的结果:

class_<Foo>("Foo")
.def(init<bool>())
.def(init<double>())
.def(init<int>());

Foo() # calls Foo()
Foo(True) # calls Foo(int)
Foo(1) # calls Foo(int)
Foo(4.2) # calls Foo(double)

如您所见,这不是一个完美的解决方案。所以,如果您真的需要让重载的构造函数工作,我建议您使用自己的工厂函数。

using namespace boost::python;

static boost::shared_ptr<Foo>
makeFoo(const object& data)
{
boost::shared_ptr<Foo> obj;

if (PyBool_Check(data.ptr())) {
bool val = extract<bool>(data);
obj.reset(new Foo(val));
}
else if (PyFloat_Check(data.ptr())) {
double val = extract<double>(data);
obj.reset(new Foo(val));
}
else {
int val = extract<int>(data);
obj.reset(new Foo(val));
}

return obj;
}

class_<Foo>("Foo")
.def("__init__", make_constructor(makeFoo));

并使用 makeFoo:

Foo() # calls Foo()
Foo(True) # calls Foo(bool)
Foo(1) # calls Foo(int)
Foo(4.2) # calls Foo(double)

顺便说一下,docs at python.org可能有点帮助。

关于c++ - boost.python 对类似的构造函数感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8140155/

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