Swig 包装一个 C++ 数据类型?

Posted

技术标签:

【中文标题】Swig 包装一个 C++ 数据类型?【英文标题】:Swig wrap a c++ datatype? 【发布时间】:2017-08-23 05:49:01 【问题描述】:

这可能是一个简单的问题。如何从 python 调用 c++ 定义的数据类型 UInt32

test.cpp:

#include "test.h"
namespace test   
    void test(UInt32 param)  std::cout << param << std::endl; 

test.h:

#include <ios>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
#include <assert.h>
#include <cassert>
#include <cstddef>
#include <stddef.h>
namespace test 
    typedef std::uint32_t UInt32;
    void test(UInt32 param);

test.i:

%module test
%
    #define SWIG_FILE_WITH_INIT
    #include "test.h"
%
%include "test.h"    

错误:

>>> import test
>>> test.test(1)
TypeError: in method 'test', argument 1 of type 'test::UInt32'

【问题讨论】:

【参考方案1】:

这里的问题是 SWIG 不知道 UInt32 类型是什么。对于普通的 C++ typedef,您可以简单地在接口文件 using the %typedef command 中告诉 SWIG,例如:

%inline %
 typedef unsigned int size_t;
%

上述解决方案,即%apply int UInt32 ; 本质上是using the SWIG typemaps library (Typemaps.i),将UInt32 形式的参数的任何实例替换为int(SWIG 默认知道这一点)。但是,它不一定保留未签名的属性。在这里,您可能想改用%apply unsigned int UInt32 ;。 (请注意,您需要包含 Typemaps.i 才能使其正常工作)。

最后,如果你需要能够返回值(例如,你想通过引用传递它),你可以使用以下形式:

%apply unsigned int *INOUT  UInt32 ;

要走的路取决于你想做什么。如果您只需要 SWIG 将 typedef 理解为 SWIG 已经知道的(原始或派生)类型的“同义词”,typedef 方法就足够了。如果您还需要控制 SWIG 如何处理参数的行为(例如,您需要能够通过引用传递/返回值),那么类型映射(由 %apply 命令提供)是可行的方法。

【讨论】:

【参考方案2】:

使用类型映射 (link)。 最简单的应该是这样的:

%apply int  test::UInt32 ;  

【讨论】:

以上是关于Swig 包装一个 C++ 数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

使用 SWIG 围绕 C++ 的 Python 包装器。参数类型无法识别

如何使用 SWIG 在 C++ API 上生成 C 包装器? [复制]

将 python 函数传递给 SWIG 包装的 C++ 代码

SWIG:没有定义类型映射

SWIG - 包装到 C# 时 std::list 没有默认类型映射,我该怎么办?

SWIG 不接受指针参数的包装对象