关于c ++:如何公开std :: vector< int>

How to expose std::vector<int> as a Python list using SWIG?

我尝试使用swig将此函数公开给python:

1
std::vector<int> get_match_stats();

我希望swig为python生成包装代码,这样我就可以把它看作一个整数列表。

将此添加到.i文件:

1
2
3
4
5
6
7
%include"typemaps.i"
%include"std_vector.i"

namespace std
{
  %template(IntVector) vector<int>;
}

我在运行SWIG Version 1.3.36,用-Wall给swig打电话,没有收到任何警告。

我可以访问一个列表,但是在用EDCOX1(1)(用EDCOX1,3)编译时,我得到了一组警告:生成的C++代码:

1
  warning: dereferencing type-punned pointer will break strict-aliasing rules

我是否正确地暴露了功能?如果是这样,警告意味着什么?

这些是同一功能中违规行之前的行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SWIGINTERN PyObject *_wrap_IntVector_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
  PyObject *resultobj = 0;
  std::vector *arg1 = (std::vector *) 0 ;
  std::vector::iterator arg2 ;
  std::vector::iterator result;
  void *argp1 = 0 ;
  int res1 = 0 ;
  swig::PySwigIterator *iter2 = 0 ;
  int res2 ;
  PyObject * obj0 = 0 ;
  PyObject * obj1 = 0 ;

  if (!PyArg_ParseTuple(args,(char *)"OO:IntVector_erase",&obj0,&obj1)) SWIG_fail;
  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 |  0 );
  if (!SWIG_IsOK(res1)) {
    SWIG_exception_fail(SWIG_ArgError(res1),"in method '""IntVector_erase""', argument""1"" of type '""std::vector *""'");
  }
  arg1 = reinterpret_cast * >(argp1);

这是冒犯的一句话:

1
  res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::PySwigIterator::descriptor(), 0);

接下来还有更多的代码。

使用G++4.2.4编译时生成的警告是:

1
2
swig_iss_wrap.cxx: In function ‘PyObject* _wrap_IntVector_erase__SWIG_0(PyObject*, PyObject*):
swig_iss_wrap.cxx:5885: warning: dereferencing type-punned pointer will break strict-aliasing rules


1
%template(IntVector) vector<int>;


我对SWIG没有太多的经验,但是你是否在你的.i文件中包含C++头文件?尝试其中一个(或两个)

1
2
3
4
5
6
%include"myvector.h"


%{
#   include"myvector.h"
%}