Boost.Python对类似构造函数的使用感到困惑

7
我有一个类,看起来像这样:
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中的to时,Python代码总是将c'tor参数转换为double(这通常是类def export中的最后一个参数)。是否有一种方法可以明确告诉boost.python如何显式处理类型?

1个回答

13

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

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)

顺便提一下,python.org的文档可能会有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接