【问题标题】:boost-python: How do I provide a custom constructor wrapper function?boost-python:如何提供自定义构造函数包装函数?
【发布时间】:2013-09-13 19:37:41
【问题描述】:

我正在使用 boost-python 为名为 CppClass 的 C++ 类创建 python 绑定。必要时,我可以通过预处理参数的小包装函数将调用路由到“普通”成员函数(例如,从 python args 中提取 C++ 类型),如下所示:

class CppClass
{
public:
    CppClass(SpecialParameters p);
    void doSomething(int x, float y);
};

using namespace boost::python; // For extract, tuple, init, class_, etc.

class WrapperFuncs
{
public:
    static void doSomething(CppClass & c, tuple t)
    {
        // Special extraction: Convert python arg ( a tuple) into C++ args.
        int x = extract<int>(t.attr("__getitem__")(0));
        float y = extract<float>(t.attr("__getitem__")(1));
        c.doSomething(x,y);
    }
};

class_<CppClass, boost::shared_ptr<CppClass> >
    ("CppClass", init<SpecialParameters>())
    .def("doSomething", &WrapperFuncs::doSomething, (arg("t")))

但是我该如何为CppClass 构造函数做同样的事情

【问题讨论】:

    标签: c++ boost-python


    【解决方案1】:

    使用no_init 后跟.def 代表__init__ 使用boost::python::make_constructor()

    class WrapperFuncs
    {
    public:
        static boost::shared_ptr<CppClass> initWrapper( object const & p )
        {
            SpecialParameters sp = ... // do complicated extraction here.
            return boost::shared_ptr<CppClass>( new CppClass(sp) );
        }
    
        static void doSomething(CppClass & c, tuple t) { /*...*/ }
    };
    
    class_<CppClass, boost::shared_ptr<CppClass> >
        ("CppClass", no_init)
        .def("__init__", make_constructor(&WrapperFuncs::initWrapper))
        .def("doSomething", &WrapperFuncs::doSomething, (arg("t")))
    

    python wiki 的This section 解释了如何做到这一点,但它对我来说并不适用,因为它没有提到no_init。就我而言,no_init 是必需的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多