在boost python中酸洗一个向量?

2024-05-29 11:10:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个简单的C++代码:

class Contained {};

class CannotPickle {
public:
    CannotPickle() {};
    CannotPickle(std::vector<boost::shared_ptr<Contained>> new_vector) 
      : my_vector(new_vector) {};
    std::vector<boost::shared_ptr<Contained>> my_vector;
};

struct CannotPickle_pickle_suite : boost::python::pickle_suite
{
    static
    boost::python::tuple
    getinitargs(CannotPickle const& c)
    {
        return boost::python::make_tuple(c.my_vector);
    }
};

我正在尝试为CannotPickle启用pickle支持,如下所示:

^{pr2}$

当我试图在CannotPickle上实际调用pickle时,我得到以下错误: 运行时错误:Pickling of“MyModule.ContainedPtrList“实例未启用(http://www.boost.org/libs/python/doc/v2/pickle.html

如何启用vector_indexing_suite的酸洗?在


Tags: 代码newmy错误pickleclasssuiteshared
1条回答
网友
1楼 · 发布于 2024-05-29 11:10:33

一些额外的搜索产生了这段代码,它似乎起作用了:

#include <vector>

#include <boost/python.hpp>
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
#include <boost/smart_ptr.hpp>
namespace py = boost::python;

template <class C>
struct PickleSuite: public py::pickle_suite { BOOST_STATIC_ASSERT(sizeof(C)==0); };

template <typename  T>
struct PickleSuite< std::vector<T> >: public py::pickle_suite
{
    static py::tuple getinitargs(const std::vector<T>& o)
    {
        return py::make_tuple();
    }

    static py::tuple getstate(py::object obj)
    {
        const std::vector<T>& o = py::extract<const std::vector<T>&>(obj)();

        return py::make_tuple(py::list(o));
    }

    static void setstate(py::object obj, py::tuple state)
    {
        std::vector<T>& o = py::extract<std::vector<T>&>(obj)();

        py::stl_input_iterator<typename std::vector<T>::value_type> begin(state[0]), end;
        o.insert(o.begin(),begin,end);
    }
};

相关问题 更多 >

    热门问题