Swig包装c ++数据类型?

时间:2017-08-23 05:49:01

标签: python c++ swig

这可能是一个简单的问题。我如何从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'

2 个答案:

答案 0 :(得分:0)

使用字体映射(link)。 最简单的应该是:

%apply int { test::UInt32 };  

答案 1 :(得分:0)

这里的问题是SWIG不知道UInt32&#34;是什么类型。&#34;对于普通的C ++ typedef,您只需在接口文件using the %typedef command中告诉SWIG,例如:

%inline %{
 typedef unsigned int size_t;
%}

上述解决方案,即%apply int{ UInt32 };基本上是using the SWIG typemaps libraryTypemaps.i),用UInt32替换形式int的任何参数实例(其中SWIG默认知道)。但是,它不一定保留无符号属性。在这里,您可能希望使用%apply unsigned int { UInt32 };。 (请注意,您需要包含Typemaps.i才能实现此目的。)

最后,如果您需要能够返回该值(例如,您希望通过引用传递它),则可以使用以下格式:

%apply unsigned int *INOUT { UInt32 };

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