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

我有一个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工作向量,或者直接访问C ++ typedef。 我打电话给SWIG并使用Python Distutils进行编译。

谢谢你的帮助!


我解决了它。

好像问题是我不得不告诉SWIG关于已经存在于接口文件的%{%}括号中的typedef,即

/* my_interface.i */

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

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

虽然我不是100%,但这是错误的。 无论如何,我现在有一个类似上面的界面文件和包装工程。

链接地址: http://www.djcxy.com/p/48331.html

上一篇: Accessing C++ typedef in Python using SWIG

下一篇: generated Constants in Python