如何std::pair
使用 python暴露boost::python
?例如,当我公开时,vector<string>
我只写:
class_<std::vector<std::string> >("StringVec")
.def(vector_indexing_suite<std::vector<std::string> >())
;
但我不知道如何处理 std::pair。
如何std::pair
使用 python暴露boost::python
?例如,当我公开时,vector<string>
我只写:
class_<std::vector<std::string> >("StringVec")
.def(vector_indexing_suite<std::vector<std::string> >())
;
但我不知道如何处理 std::pair。
我找到了解决方案。最简单的暴露示例std::pair
是:
class_<std::pair<int, int> >("IntPair")
.def_readwrite("first", &std::pair<int, int>::first)
.def_readwrite("second", &std::pair<int, int>::second);
我正在使用以下代码公开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;
};
在我的 mainBOOST_PYTHON_MODULE()
中,我可以只使用 egpy_pair<int, int>();
来公开一对整数。