用于STL指向类的指针的SWIG类型映射

时间:2017-03-17 00:42:19

标签: python c++ pointers stl swig

我试图将一个类的指针的C ++ STL地图SWIG包装(版本3)到Python 3:

example.h文件

#include <map>

using namespace std;

class Test{};

class Example{
public:
    map<int,Test*> my_map;
    Example() 
    {
        int a=0;
        Test *b = new Test();
        this->my_map[a] = b;
    }
};

example.i

%module example

%{
     #include "example.h"
%}

using namespace std;

%typemap(out) map<int,Test*> {
  $result = PyDict_New();

  map<int,Test*>::iterator iter;
  Test* theVal;
  int theKey;

  for (iter = $1.begin(); iter != $1.end(); ++iter) {
    theKey = iter->first;
    theVal = iter->second;
    PyObject *value = SWIG_NewPointerObj(SWIG_as_voidptr(theVal), SWIGTYPE_p_Test, 0);
    PyDict_SetItem($result, PyInt_FromLong(theKey), value);
  }
};

class Test{};

class Example{
public:
  map<int,Test*> my_map;
};

没有错误,但现在在Python 3中运行

import example
t = example.Example()
t.my_map

返回

<Swig Object of type 'map< int,Test * > *' at 0x10135e7b0>

而不是字典。它还有一个指向地图的指针,而不是地图。如何编写正确的%typemap以将STL映射转换为Python 3字典?

我已经能够为例如int to int - 它是指向一个给我带来麻烦的类的指针。

感谢。

1 个答案:

答案 0 :(得分:2)

让我从SWIG手册中获取相关条目...... here

这告诉您成员变量my_map是通过SWIG生成的getter访问的,它返回map<int,Test*> *(或者,如果您给出%naturalvar指令,则返回引用)。因此,必须编写out out typemap以处理map<int,Test*> *而不是map<int,Test*>