How to open std :: pair for python using boost :: python?

How to set std::pair in python using boost::python ? When I expose, for example, vector<string> , I simply write:

 class_<std::vector<std::string> >("StringVec") .def(vector_indexing_suite<std::vector<std::string> >()) ; 

But I do not know how to handle std :: pair.

+6
source share
2 answers

I have found a solution. The simplest std::pair expansion example:

 class_<std::pair<int, int> >("IntPair") .def_readwrite("first", &std::pair<int, int>::first) .def_readwrite("second", &std::pair<int, int>::second); 
+8
source

I use the following code to expose std::pair<> as Python tuples:

 #include <boost/python.hpp> namespace py = boost::python template<typename T1, typename T2> struct PairToPythonConverter { static PyObject* convert(const std::pair<T1, T2>& pair) { return py::incref(py::make_tuple(pair.first, pair.second).ptr()); } }; template<typename T1, typename T2> struct PythonToPairConverter { PythonToPairConverter() { py::converter::registry::push_back(&convertible, &construct, py::type_id<std::pair<T1, T2> >()); } static void* convertible(PyObject* obj) { if (!PyTuple_CheckExact(obj)) return 0; if (PyTuple_Size(obj) != 2) return 0; return obj; } static void construct(PyObject* obj, py::converter::rvalue_from_python_stage1_data* data) { py::tuple tuple(py::borrowed(obj)); void* storage = ((py::converter::rvalue_from_python_storage<std::pair<T1, T2> >*) data)->storage.bytes; new (storage) std::pair<T1, T2>(py::extract<T1>(tuple[0]), py::extract<T2>(tuple[1])); data->convertible = storage; } }; template<typename T1, typename T2> struct py_pair { py::to_python_converter<std::pair<T1, T2>, PairToPythonConverter<T1, T2> > toPy; PythonToPairConverter<T1, T2> fromPy; }; 

In my main BOOST_PYTHON_MODULE() I can just use for example. py_pair<int, int>(); to set a pair of integers.

+4
source

Source: https://habr.com/ru/post/944767/


All Articles