为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用boost :: python将std :: pair暴露给python?

如何使用boost :: python将std :: pair暴露给python?

拉丁的传说 2021-03-15 17:18:12
如何使用暴露std::pair给python boost::python?例如,当我公开时,vector<string>我只写:class_<std::vector<std::string> >("StringVec")    .def(vector_indexing_suite<std::vector<std::string> >());但是我不知道如何处理std :: pair。
查看完整描述

2 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

我找到了解决方案。暴露的最简单示例std::pair是:


class_<std::pair<int, int> >("IntPair")

    .def_readwrite("first", &std::pair<int, int>::first)

    .def_readwrite("second", &std::pair<int, int>::second);


查看完整回答
反对 回复 2021-03-23
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

我正在使用以下代码将其公开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;

};

在我的main内BOOST_PYTHON_MODULE(),然后可以使用例如py_pair<int, int>();暴露一对整数。


查看完整回答
反对 回复 2021-03-23
  • 2 回答
  • 0 关注
  • 237 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信