2013-05-11 14 views

Odpowiedz

8

Znalazłem rozwiązanie. Najprostszym przykładem wystawiając std::pair jest:

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

Jednak to właśnie tworzy nową klasę Python "IntPair" i nie wykorzystuje ponownie żadnych istniejących funkcji Pythona. Byłoby wspaniale wyeksponować to jako krotka Python. – Tali

4

Używam poniższy kod, żeby odsłonić std::pair<> jak Python krotek:

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

w moim głównym BOOST_PYTHON_MODULE(), mogę wtedy wystarczy użyć np py_pair<int, int>();, aby odsłonić parę liczb całkowitych.

Powiązane problemy