使用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