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

标签 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 的 vector 。我将 .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 进行编译。

感谢您的帮助!

最佳答案

我解决了。

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

/* my_interface.i */

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

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

虽然我不是 100% 认为这是错误的。无论如何,我现在有一个像上面那样的接口(interface)文件并且包装工作。

关于c++ - 使用 SWIG 在 Python 中访问 C++ typedef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8155224/

相关文章:

c++ - 正在初始化类型为 "int &"的引用(不是 const 限定的),其值是 "bool"类型的一些 hack?

python - 初始化 python ctypes 结构体字段的更好方法

python - 打开 .exe 并通过 Python 子进程向其传递命令?

swig - 在 C++ 中扩展嵌入式 Python - 设计与 C++ 实例交互

c++ - 具有透明缓冲区的 DirectX11 ClearRenderTargetViewback?

c++ - std::list 中最后一个元素的迭代器

python - plotly python : force axis limits (range)

c++ - SWIG 无法正确转换 typedef 类型

c++ - 向 Python 公开 C++ API

c++ - 如何实例化 wchar_t** 数组