2013-05-11 4 views
6

boost::python का उपयोग कर std::pair को पायथन पर कैसे उजागर करें? जब मैं उदाहरण vector<string> के लिए बेनकाब मैं बस लिखना:बूस्ट :: पायथन का उपयोग कर std :: जोड़ी को पायथन में कैसे बेनकाब करें?

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

लेकिन मैं std :: जोड़ी से निपटने के लिए कैसे पता नहीं है।

उत्तर

8

मुझे एक समाधान मिला। 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

हालांकि, यह सिर्फ एक नया पायथन वर्ग "इंटपेयर" बनाता है और किसी भी मौजूदा पायथन सुविधाओं का पुन: उपयोग नहीं करता है। इसके बजाय इसे पाइथन टुपल के रूप में बेनकाब करना बहुत अच्छा होगा। – Tali

4

मैं अजगर tuples के रूप में std::pair<> बेनकाब करने के लिए निम्नलिखित कोड का उपयोग कर रहा:

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

के भीतर अपने मुख्य BOOST_PYTHON_MODULE(), मैं तो बस का उपयोग कर सकते उदा पूर्णांक की एक जोड़ी का पर्दाफाश करने के लिए py_pair<int, int>();

संबंधित मुद्दे