Boost.Python 返回一个不可复制对象的列表
Posted
技术标签:
【中文标题】Boost.Python 返回一个不可复制对象的列表【英文标题】:Boost.Python return a list of noncopyable objects 【发布时间】:2016-03-28 12:28:50 【问题描述】:我有一个不可复制的类型 X
,我想公开一个创建 list
的函数:
#include <boost/python.hpp>
namespace py = boost::python;
struct X
X(int i) : i(i)
X(const X& ) = delete;
X& operator=(X const&) = delete;
int i;
friend std::ostream& operator<<(std::ostream& os, X const& x)
return os << "X(" << x.i << ")";
;
py::list get_xs(int n)
py::list xs;
for (int i = 0; i < n; ++i)
xs.append(Xi);
return xs;
BOOST_PYTHON_MODULE(Foo)
py::class_<X, boost::noncopyable>("X", py::init<int>())
.def(str(py::self))
.def(repr(py::self))
;
py::def("get_xs", get_xs);
这编译得很好,但是当我尝试使用它时,让我感到害怕:
>>> import Foo
>>> Foo.get_xs(10)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: No to_python (by-value) converter found for C++ type: X
这个错误实际上是什么意思?我该如何解决?
【问题讨论】:
【参考方案1】:noncopyable
看起来是问题所在。当X
可以复制时,一切都很好。
如果X
必须是noncopyable
,那么可以使用boost::shared_ptr
:
py::list get_xs(int n)
py::list xs;
for (int i = 0; i < n; ++i)
xs.append(boost::shared_ptr<X>(new X(i)));
return xs;
....
BOOST_PYTHON_MODULE(Foo)
py::class_<X, boost::shared_ptr<X>, boost::noncopyable>("X", py::init<int>())
...
...
py::register_ptr_to_python<boost::shared_ptr<X>>();
【讨论】:
以上是关于Boost.Python 返回一个不可复制对象的列表的主要内容,如果未能解决你的问题,请参考以下文章