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 返回一个不可复制对象的列表的主要内容,如果未能解决你的问题,请参考以下文章

复制 boost.python 对象

Boost.Python 对象的 id

Boost Python官方样例

Boost Python 包装的虚拟类子返回错误:与 C++ 签名不匹配

Python 'dict' 对象不可调用? [复制]

Boost/Python 有 make_array 方法吗?