使用 SWIG 使用默认值包装 C++ 函数

Using SWIG to Wrap C++ Function With Default Values

我在 say.hpp 中有以下 C++ 函数:

#include <iostream>


void say(const char* text, const uint32_t x = 16, const uint32_t y = 24, const int32_t z = -1) {
    std::cout << text << std::endl;
}

这是我的 say.i:

%module say
%{
#include "say.hpp"
%}

%include "say.hpp"

然后,我构建了共享库:

$ swig -python -c++ -I/usr/include say.i
$ g++ -fPIC -c say_wrap.cxx -I/opt/rh/rh-python38/root/usr/include/python3.8 
$ g++ -shared say_wrap.o -o _say.so

然后,我试着调用它:

>>> import say
>>> say.say("hello")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/hc/test/cpp/say.py", line 66, in say
    return _say.say(text, x, y, z)
TypeError: Wrong number or type of arguments for overloaded function 'say'.
  Possible C/C++ prototypes are:
    say(char const *,uint32_t const,uint32_t const,int32_t const)
    say(char const *,uint32_t const,uint32_t const)
    say(char const *,uint32_t const)
    say(char const *)

>>> 

函数参数的默认值似乎有问题,因为一旦我删除它们,它就可以工作了。

有什么想法吗?

使用以下 say.i 文件。 SWIG 已经为标准整数类型预写了代码,需要将其包含在内才能理解它们。没有它们,包装器接收默认值作为不透明的 Python 对象,并且不知道如何将它们转换为正确的 C++ 整数类型。

%module say
%{
#include "say.hpp"
%}
%include <stdint.i>
%include "say.hpp"

结果:

>>> import say
>>> say.say('hello')
hello
>>> say.say('hello',1,2,3)
hello

请注意,您也可以直接提供 typedef,但最好使用 stdint.i:

%module say
%{
#include "say.hpp"
%}
typedef unsigned int uint32_t;
typedef int int32_t;
%include "say.hpp"