[英]Pickling a vector in boost 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支持:
class_<Contained>("Contained");
class_<std::vector<boost::shared_ptr<Contained>>>("ContainedPtrList")
.def(vector_indexing_suite<std::vector<boost::shared_ptr<Contained>>, true>());
class_<CannotPickle>("CannotPickle")
.def_pickle(CannotPickle_pickle_suite());
当我尝试在CannotPickle
上实际调用pickle
,我收到此错误:RuntimeError:未启用“MyModule.ContainedPtrList”实例的CannotPickle
( http://www.boost.org/libs/python/doc/v2/pickle.html )
如何为vector_indexing_suite
启用酸洗?
一些额外的搜索产生了这个代码,似乎工作:
#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);
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.