2013-05-11 41 views

Trả lời

8

Tôi đã tìm được giải pháp. Ví dụ đơn giản nhất của lộ std::pair là:

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

Tuy nhiên, điều này chỉ tạo một lớp Python mới "IntPair" và không sử dụng lại bất kỳ tính năng Python hiện có nào. Nó sẽ là tuyệt vời để lộ nó như là một tuple Python để thay thế. – Tali

4

Tôi đang sử dụng đoạn mã sau để lộ std::pair<> như 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; 
}; 

Trong tôi chính BOOST_PYTHON_MODULE(), tôi có thể sau đó chỉ cần sử dụng ví dụ py_pair<int, int>(); để hiển thị một cặp số nguyên.

Các vấn đề liên quan