在SWIG中键入检查和重载方法

时间:2017-09-18 20:07:29

标签: python c++ swig

我有一个C ++方法,可以被称为x(const std::string &a, bool b=true)x(const SomeClass &object, bool b=true)

在Python中,我可以使用x('Hello', True)x('Hello')以及x(someObject, True)调用SWIG包装器。

但是,如果我尝试像x('Hi', 'Hello')那样的swig不会将'Hello'转换为bool,那么我会得到NotImplementedError: Wrong number or type of arguments for overloaded function

如果存在,我怎么能告诉它将第二个参数转换为bool?

---更新------------------------------------------- -----------

https://github.com/swig/swig/blob/master/CHANGES#L1527-L1581

上面的链接似乎暗示现在这是理想的行为,虽然它当然可以用类型图改变......?

2 个答案:

答案 0 :(得分:2)

您可以为SWIG编写一个类型映射,为任何输入调用Python对象协议函数PyObject_IsTrue

%module test
%typemap(in) bool b "$1=PyObject_IsTrue($input);"
void foobar(bool b=true);

答案 1 :(得分:1)

最后,我这样修好了(可能有后果......):

#if defined(SWIGPYTHON)
    %typemap(typecheck,precedence=SWIG_TYPECHECK_BOOL) bool { $1 = 1; }
    %typemap(in) bool { $1=PyObject_IsTrue($input); }
#endif

第一个typemap告诉swig在Python中可以将所有内容视为bool。 第二个,来自@ flexo的回答,将匹配的参数转换为C ++ bool。