我有一个类似于
的课程class Foo{
Foo();
Foo(int i);
Foo(bool b);
Foo(double d);
};
我像往常一样将我的类暴露给python
class_<Foo>("Foo")
.def(init<int>())
.def(init<bool>())
.def(init<double>());
当我尝试在python中使用时,python代码总是将c'tor参数转换为double(这是类def导出中的最后一个)。有没有办法明确告诉boost.python如何通过类型显式处理?
答案 0 :(得分:11)
那么,您可以更改构造函数定义的顺序,最后一个将具有更高的优先级。这是我的结果:
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可能会有所帮助。