我有这个设置,想把它移植到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_object
,with_custodian_and_ward_postcall<1,0> >()
,但在当前设置中没有,则似乎有效。问题是使用const_a()
提取的对象在python中也是可变的,这是不可取的。
我在编译时收到的错误是:
错误:无法匹配_(const 升压::蟒::详细:: copy_non_const_reference_expects_a_non_const_reference_return_type
有没有办法正确地在python中公开这个函数?我无法对基类进行更改,但我可以添加一些小的包装器,如add_a(),如果这有助于我实现最终目标。