我正在为现有的 C++ 库编写一个包装器,该库利用列表,其中 T 是自定义结构。有人建议我使用向量而不是列表,但我试图避免修改库。
为了更好地理解这个场景,我制作了一个简单的应用程序,使用一个列表作为代理来注册一个 to-python 转换(它可以是只读的)。
我当前的实现编译得很好,python 导入得很好,可以创建对象,但是当我调用数据成员时,它会出错。
蟒蛇外壳输出:
In [1]: import my_list
In [2]: x = my_list.Bob()
In [3]: x.foos
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-2f015d13a87d> in <module>()
----> 1 x.foos
TypeError: No Python class registered for C++ class std::list<int, std::allocator<int> >
C++ 文件:
#include <list>
#include <boost/python.hpp>
#include <boost/foreach.hpp>
#ifndef FOREACH
#define FOREACH BOOST_FOREACH
#endif
using namespace std;
using namespace boost::python;
template<typename T>
struct list_to_list
{
static PyObject* convert(const std::list<T>& src)
{
boost::python::list result;
FOREACH (const T& val, src)
{
result.append(val);
}
return incref(result.ptr());
}
};
struct Bob
{
std::list<int> foos;
};
BOOST_PYTHON_MODULE(my_list)
{
using namespace boost::python;
to_python_converter<std::list<int>, list_to_list<int> >();
class_<Bob>("Bob")
.def_readonly("foos", &Bob::foos)
;
}
我错过了什么吗?