使用SWIG在Python中访问C ++ typedef

时间:2011-11-16 16:34:53

标签: c++ python swig

我有一个C ++ API,我试图用Python包装。我想调用一个包装的C ++函数myfunc,将以下C ++ typedef

作为参数
/* my_header.h */

namespace my_namespace {
typedef std::vector<Foo> Bar
}

其中Foo是C ++类。我设法包装函数和底层类Foo,但我不知道如何创建Foo的向量。我将.h文件包含在我的SWIG .i文件中,如下所示

/* my_interface.i */

%{
#include "my_header.h"
typedef my_namespace::Bar Bar;
%}

%include "my_header.h"

我也尝试在SWIG中包装std :: vector模板,如下所示

%include std_vector.i
namespace std {
    %template(vector_foo) vector<Foo>;
}

这很有效,我可以在Python中导入vector_foo。但是,当我将vector_foo作为参数发送到上面提到的函数时,我得到一个TypeError。我也不能用Foo填充vector_foo。

在Python中我执行以下操作

>>> a = mymodule.vector_foo()
>>> a
<Swig Object of type 'std::vector <Foo, std::allocator< Foo > > *'
>>> mymodule.myfunc(a, 'string')
TypeError: in method 'myfunc', argument 1 of type 'my_namespace::Bar &'

要么我可以自己实现Foo的vector工作,要么以某种方式直接访问C ++ typedef。我正在调用SWIG并使用Python Distutils进行编译。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

我解决了。

似乎问题是我必须告诉SWIG有关接口文件中%{%}括号中已经存在的typedef,即

/* my_interface.i */

%{
#include "my_header.h"
typedef my_namespace::Bar Bar;
%}

typedef my_namespace::Bar Bar;
%include "my_header.h"

虽然我不是100%这是错误的。无论如何,我现在有一个像上面那样的包装工具。