2013-05-11 9 views
6

Come esporre std::pair in python usando boost::python? Quando mi espongo ad esempio vector<string> ho semplicemente scritto:Come esporre std :: pair a python usando boost :: python?

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

Ma io non so come trattare con std :: coppia.

risposta

8

Ho trovato una soluzione. L'esempio più semplice di esporre std::pair è:

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

Tuttavia, questo crea solo una nuova classe Python "IntPair" e non riutilizza le funzionalità Python esistenti. Sarebbe bello esporlo come una tupla Python invece. – Tali

4

Sto utilizzando il seguente codice per esporre std::pair<> come Python tuple:

#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; 
}; 

Entro il mio principale BOOST_PYTHON_MODULE(), posso poi basta usare per esempio py_pair<int, int>(); per esporre una coppia di numeri interi.