将 Boost Python 与 shared_ptr<const T 结合使用>
Using Boost Python with shared_ptr<const T>
Boost Python 1.63(Python 2.7.13)与shared_ptr<T>
搭配得很好;如果我在C 中写这篇文章:
shared_ptr<Foo> create_shared_ptr() { return shared_ptr{...}; }
void accept_shared_ptr(const shared_ptr<Foo>& p) { }
...
class_<Foo, boost::noncopyable>("Foo", no_init); //Expose abstract class
register_ptr_to_python< shared_ptr<Foo> >();
def("create_shared_ptr", create_shared_ptr);
def("accept_shared_ptr", accept_shared_ptr);
然后,我可以在python中写下它,一切都有效:
accept_shared_ptr(create_shared_ptr())
我尝试包装 然后我得到错误: 似乎内部质量正在实现从Python 无济于事。我该如何解决?shared_ptr<const Foo>
。 shared_ptr<const Foo> create_shared_ptr() { return shared_ptr{...}; }
void accept_shared_ptr(const shared_ptr<const Foo>& p) { }
Boost.Python.ArgumentError: Python argument types in
mod_python.accept_shared_ptr(Foo)
did not match C++ signature:
accept_shared_ptr(std::shared_ptr<Foo const>)
Foo
到C shared_ptr<Foo>
的转换,但不能转换为C shared_ptr<const Foo>
。使用register_ptr_to_python< shared_ptr<const Foo> >();
问题必须在您的类/方法的定义中。此代码对我有用(我的提升为1.62和Python 2.7.13):
class Foo {
public:
virtual ~Foo() = default;
virtual std::string xxx() = 0;
};
class Bar: public Foo {
public:
~Bar() override = default;
std::string xxx() override { return "xxx"; }
};
std::shared_ptr<const Foo> create_shared_ptr() {
return std::shared_ptr<const Foo>(new Bar);
}
void accept_shared_ptr(const std::shared_ptr<const Foo>& p)
{
; // do nothing
}
BOOST_PYTHON_MODULE(myLib)
{
using namespace boost::python;
class_<Foo, boost::noncopyable>("Foo", no_init);
register_ptr_to_python< std::shared_ptr<const Foo> >();
def("create_shared_ptr", create_shared_ptr);
def("accept_shared_ptr", accept_shared_ptr);
}
然后,在Python中,我可以做:
$ python
Python 2.7.13 (default, Jan 19 2017, 14:48:08)
[GCC 6.3.0 20170118] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import myLib
>>> ptr = myLib.create_shared_ptr()
>>> ptr
<myLib.Foo object at 0x7f8b5fde0aa0>
>>> myLib.accept_shared_ptr(ptr)
很可能您的函数create_shared_ptr
以某种方式返回了一个错误的值,该值被Python误解了。
添加
implicitly_convertible<std::shared_ptr<Foo>,std::shared_ptr<const Foo>>();
解决问题。