【问题标题】:boost.python confused about similar constructorboost.python 对类似的构造函数感到困惑
【发布时间】:2011-11-15 17:02:58
【问题描述】:

我有一个看起来像这样的课程

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 导出中的最后一个)。有没有办法显式告诉 boost.python 如何按类型显式处理?

【问题讨论】:

    标签: c++ python boost


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 2021-12-31
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      相关资源
      最近更新 更多