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.
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