【问题标题】:How to expose std::pair to python using boost::python?如何使用 boost::python 将 std::pair 暴露给 python?
【发布时间】:2013-05-06 01:27:22
【问题描述】:

如何使用boost::pythonstd::pair 暴露给python?例如,当我公开vector<string> 时,我只写:

class_<std::vector<std::string> >("StringVec")
    .def(vector_indexing_suite<std::vector<std::string> >())
;

但我不知道如何处理 std::pair。

【问题讨论】:

    标签: c++ python boost std boost-python


    【解决方案1】:

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

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

    【讨论】:

    • 但是,这只是创建了一个新的 Python 类“IntPair”,并没有重用任何现有的 Python 功能。将它公开为 Python 元组会很棒。
    【解决方案2】:

    我正在使用以下代码将 std::pair&lt;&gt; 公开为 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&lt;int, int&gt;(); 公开一对整数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多