Boost.PythonC++ STD:指针的向量

2024-10-03 09:10:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我在用Boost.Python要为我的C++库创建包装器,而且我遇到了一些麻烦,整天都在搜索,并没有产生任何结果。例如,我有以下代码:

class Base
{
public:
    virtual void func() = 0;
};

class Derived : public Base
{
public:
    virtual void func()
    {
        cout << "Derived::func()"<< endl;
    }
};


// wrapper for Base
struct BaseWrapper : Base, python::wrapper<Base>
{
    virtual void func()
    {
        this->get_override("func");
    }
};


Base* makeDerived()
{
    return new Derived;
}

vector<Base*>* makeDerivedVec()
{
    vector<Base*> *v = new vector<Base*>;
    v->push_back(new Derived);
    v->push_back(new Derived);
    v->push_back(new Derived);
    return v;
}

BOOST_PYTHON_MODULE(mylib)
{
    // export Base
    class_<BaseWrapper, noncopyable>("Base")
            .def("func", pure_virtual(&Base::func));

    class_<vector<Base*> >("BasePtrVec")
            .def(vector_indexing_suite<vector<Base*> >());

    // export Derived
    class_<Derived, bases<Base> >("Derived")
            .def("func", &Derived::func);

    // export makeDerived()
    def("makeDerived", &makeDerived, return_value_policy<manage_new_object>());

    // export makeDerivedVec()
    def("makeDerivedVec", &makeDerivedVec, return_value_policy<manage_new_object>());
}

因此,我编译它,用python导入并尝试以下操作:

b = mylib.Base() b.func()

d = mylib.makeDerived() d.func()

正如预期的那样,第一行抛出一个异常,说明b.func()是纯虚的,第二行输出

Derived::func()

没关系。在

但是密码

^{pr2}$

不起作用,Python抛出一个异常:

TypeError: No to_python (by-value) converter found for C++ type: Base*

为什么它正确处理makeDerived()返回的Base*,并拒绝使用std::vector中包含的Base*?我该怎么做?在


Tags: newbasereturndefvirtualexportpublicpush
1条回答
网友
1楼 · 发布于 2024-10-03 09:10:17

可以通过将Base*注册为可用于指向BaseWrapper*的类型来解决此问题:

class_<BaseWrapper, noncopyable, Base*>("Base")
        .def("func", pure_virtual(&Base::func));

但这似乎意味着Base不能有一个纯虚函数。。。在

相关问题 更多 >