SWIG:自定义类的对象作为输出参数(使用 Python)

标签 swig

(这是我昨天问的问题,但我简化了它)

我创建了一个类,其中我想要两个对象作为函数(下面称为 Test)的输出参数。但是,当我运行 swig 命令 swig -c++ -python swigtest.i 时,出现错误“警告 453:无法应用(MyClass 和输出)。未定义类型映射。”我尝试添加类型映射,但这无济于事。我也尝试过使用指针、指向指针的指针和指向指针的引用,这也无济于事。

我觉得我忽略了一些简单的事情,因为这应该是一件很常见的事情。或者我是否需要编写一个复杂的类型映射,就像我已经看到但(还)不理解的那样?

下面是我的代码:

MyClass.h(已简化以使其易于理解,因此仅切换到 int 没有帮助):

class MyClass
{
    int x;
public:
    int get() const
    {
        return x;
    }
};

void Test(MyClass &obj1, MyClass &obj2);

swigtest.i:

%module swigtest

%include typemaps.i

%{
#define SWIG_FILE_WITH_INIT
%}

%{
#include "MyClass.h"
%}

%include "MyClass.h"

%apply (MyClass& OUTPUT)  { MyClass &obj1 }
%apply (MyClass& OUTPUT)  { MyClass &obj2 }

最佳答案

如我之前的评论所述,%apply OUTPUT 技巧仅适用于一组有限的 POD 类型。

对于 future 的 Swiggers,此解决方案对我有用(在 C# 绑定(bind)中):

%typemap(cstype) CustomType* "out CustomType"
%typemap(csin,
   pre="    $csclassname temp$csinput = new $csclassname();",
  post="    $csinput = temp$csinput;"
) CustomType* "$csclassname.getCPtr(temp$csinput)"

这会为通过指针传递的 CustomType 生成一个带有“out”参数的公共(public)接口(interface)。内部 P/Invoke 接口(interface) (csim) 保留为原始指针。 “csin”类型映射创建一个临时变量并分配给输出参数。

另外值得注意的是,在 C# 中,如果 MyCustomType 已经是一个引用类型,您可能不需要这个,但是有一个 API 可以修改参数值而不将其声明为“out”(这实际上适用于我的类型,但我更喜欢显式输出参数)。

关于SWIG:自定义类的对象作为输出参数(使用 Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21849198/

相关文章:

go - 由于缺少包含路径,无法构建使用 Swig 构建的 go 模块

c++ - Swig:ValueWrapper 和模板 BUG?

python - 在 python docker 镜像上安装 simstring (SWIG)

java - 使用 SWIG 将 char * 类型结构的成员转换为 Java 中的 java.lang.Object

c++ - SWIG: 'module' 对象没有属性 'Decklist'

从 Python 包中调用时,Python OR-tools 函数不起作用

c# - 包装包含 vector 的模板类时如何让 SWIG 应用模板?

c# - 在 C# 中为 C++ 函数指针生成 SWIG 包装器

python - 使用 SWIG 将 C++ 文件包装为 Python 文件

python swig 字符串到 char* 的转换