2013-05-11 55 views

回答

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

但是,這只是創建一個新的Python類「IntPair」,並且不重用任何現有的Python功能。將它作爲一個Python元組來代替將是一件好事。 – Tali 2017-01-11 12:38:08

4

我用下面的代碼暴露std::pair<>像Python元組:

#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>();來公開一對整數。

相關問題