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

发布于 2024-12-16 11:21:31 字数 1244 浏览 0 评论 0原文

我有一个 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 进行编译。

感谢您的帮助!

I have a C++ API I'm trying to wrap in Python. I want to call a wrapped C++ function myfunc taking as an argument the following C++ typedef

/* my_header.h */

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

where Foo is a C++ class. I managed to wrap the function and the underlying class Foo, but I don't know how to create the vector of Foo. I included the .h file in my SWIG .i file as follows

/* my_interface.i */

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

%include "my_header.h"

I also tried wrapping the std::vector template in SWIG, as follows

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

This works, and I can import vector_foo in Python. However, when I send a vector_foo as an argument to the function mentioned above, I get a TypeError. Neither am I able to populate vector_foo with Foo.

In Python I do the following

>>> 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 &'

Either if I can make my own implementation of vector of Foo work, or somehow access the C++ typedef directly. I'm calling SWIG and compiling using Python Distutils.

Thanks for any help!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

铜锣湾横着走 2024-12-23 11:21:31

我解决了。

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

/* my_interface.i */

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

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

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

I solved it.

Seems like the problem was I had to tell SWIG about the typedef already present in the %{ %} braces in the interface file, i.e.

/* my_interface.i */

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

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

Although I'm not 100% that this was the mistake. In any case, I now have an interface file like the above one and wrapping works.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文