Boost Python Expose重载的成员函数返回指向类对象的指针

时间:2015-12-17 12:19:10

标签: python c++ boost boost-python

我有这个设置,想把它移植到python:

class A {
    public:
        A() {}
        A(string name): name_(name) {}
        ~A() {
            for (auto it = mymap_.begin(); it != mymap.end(); ++it) {
                delete it->second;
            }
        }
        string name() const { 
            return name_; 
        }
        bool has_a(string name) const {
            return (mymap_.find(name) != mymap_.end());
        }
        A* a(string name) {
            if (has_a(name)) {
                return mymap_.at(name);
            }
            return nullptr;
        }
        const A* a(string name) const {
            if (has_a(name)) {
                return mymap_.at(name);
            }
            return nullptr;
        }
        //Owns pointer
        bool AddA(A* a) {
            if (a && !has_a(a->name())) {
                mymap_.insert(make_pair(a->name(), a));
                return true;
            }
            return false;
        }
    private:
        string name_;
        map<string, A*. mymap_;
};

我想为const和非const指针公开重载函数a(),它们的所有权不应该传递给python。

void add_a(A& a, std::unique_ptr<A>& ap) {
    a.AddA(ap.get()); ap.release();
}
A* (A::*mutable_a)(string) = &A::a;
const A* (A::*immutable_a)(string) const = &A::a;
BOOST_PYTHON_MODULE(MyModule) {
   class_<A, boost::nocopyable, boost::shared_ptr<A> >("A", init<string>())
       .def(init<>())
       .def("name", &A::name)
       .def("has_a", &A::has_a)
       .def("a", mutable_a, return_value_policy<copy_non_const_reference>())
       .def("const_a", immutable_a, return_value_policy<copy_const_reference>())
       .def("add_a", add_a, with_custodian_and_ward<1,2>())
   ;
}

如果"a()""const_a()"的返回值政策为return_value_policy<reference_existing_objectwith_custodian_and_ward_postcall<1,0> >(),但在当前设置中没有,则似乎有效。问题是使用const_a()提取的对象在python中也是可变的,这是不可取的。

我在编译时收到的错误是:

  

错误:无法匹配_(const   升压::蟒::详细:: copy_non_const_reference_expects_a_non_const_reference_return_type

有没有办法正确地在python中公开这个函数?我无法对基类进行更改,但我可以添加一些小的包装器,如add_a(),如果这有助于我实现最终目标。

0 个答案:

没有答案