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

时间:2011-11-15 17:02:58

标签: c++ python boost

我有一个类似于

的课程
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如何通过类型显式处理?

1 个答案:

答案 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可能会有所帮助。