Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用boost::python向python公开std::pair?_C++_Python_Boost_Std_Boost Python - Fatal编程技术网

C++ 如何使用boost::python向python公开std::pair?

C++ 如何使用boost::python向python公开std::pair?,c++,python,boost,std,boost-python,C++,Python,Boost,Std,Boost Python,如何使用boost::python向python公开std::pair?例如,当我公开vector时,我只需写: class_<std::vector<std::string> >("StringVec") .def(vector_indexing_suite<std::vector<std::string> >()) ; 类(“StringVec”) .def(向量索引套件()) ; 但是我不知道如何处理std::pair。我找到了一

如何使用
boost::python
向python公开
std::pair
?例如,当我公开
vector
时,我只需写:

class_<std::vector<std::string> >("StringVec")
    .def(vector_indexing_suite<std::vector<std::string> >())
;
类(“StringVec”)
.def(向量索引套件())
;

但是我不知道如何处理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);
类(“IntPair”)
.def_readwrite(“第一个”&标准::对::第一个)
.def_readwrite(“第二个”&标准::对::第二个);

我使用以下代码将
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;
};
#包括
名称空间py=boost::python
模板
结构对Python转换器{
静态PyObject*转换(常量std::pair&pair)
{
返回py::incremf(py::make_tuple(pair.first,pair.second).ptr());
}
};
模板
结构PythonToPairConverter{
PythonToPairConverter()
{
py::converter::registry::push_back(&converable,&construct,py::type_id());
}
静态void*可转换(PyObject*obj)
{
如果(!PyTuple_CheckExact(obj))返回0;
如果(PyTuple_Size(obj)!=2)返回0;
返回obj;
}
静态void构造(PyObject*obj,py::converter::rvalue\u from\u python\u stage1\u data*data)
{
py::tuple-tuple(py::借用(obj));
void*storage=(py::converter::rvalue\u from\u python\u storage*)数据)->storage.bytes;
新的(存储)std::pair(py::extract(tuple[0]),py::extract(tuple[1]);
数据->可转换=存储;
}
};
模板
结构py_对{
py::to_python_converter toPy;
PythonToPairConverter fromPy;
};

在我的主
BOOST_PYTHON_模块()
中,我可以使用例如
py_pair()
来公开一对整数。

然而,这只是创建了一个新的Python类“IntPair”,并且没有重用任何现有的Python特性。最好将其公开为Python元组。