swig,从列表到非标准向量

时间:2014-09-25 13:58:30

标签: python c++ casting swig

我想设置typemap,这样我们就可以传递Python列表而不是非标准的矢量。

在C ++中我有

template<typename T>
class mm_vector
{
void set_mm_vector(const mm_vector * copy);
}

我希望能够将Python列表作为参数传递,因此我在.i文件中指定:

// python list into vec_of_ints: from Python to C++
%typemap(in) AMM::mm_vector<int>*
{
    int i;
    if (!PyList_Check($input))
    {
      PyErr_SetString(PyExc_ValueError, "Expecting a list");
      return NULL;
    }
    Py_ssize_t size = PyList_Size($input); //get size of the list
    for (i = 0; i < size; i++)
    {
      PyObject *s = PyList_GetItem($input,i);
      if (!PyInt_Check(s))
        {
         PyErr_SetString(PyExc_ValueError, "List items must be integers");
         return NULL;
        }
      $1->push_back((int)PyInt_AS_LONG(s)); //put the value into the array
    }
}

当我尝试运行这些行时

l=[0,1]
v = mm.vec_of_ints()
v.set_mm_vector(l)

我有以下错误:

File "...", line 1295, in set_mm_vector
def set_mm_vector(self, *args): return _pyamt.vec_of_ints_set_mm_vector(self, *args)

ValueError: Expecting a list

我将不胜感激任何建议!!!

1 个答案:

答案 0 :(得分:2)

SWIG内置了对矢量和模板的支持,因此您无需从头开始实施。这是一个简短的例子:

%module vec

// Include the built-in support for std::vector
%include <std_vector.i>

// Tell SWIG about the templates you will use.
%template() std::vector<int>;

// %inline adds the following code to the wrapper and exposes its interface via SWIG.
%inline %{
class Test {
    std::vector<int> m_v;
public:
    void set(const std::vector<int>& v) { m_v = v;}
    std::vector<int> get() const {return m_v;}
};
%}

输出:

>>> import vec
>>> t=vec.Test()
>>> t.set([1,2,3])
>>> t.get()
(1, 2, 3)
相关问题