我有一个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
上面的链接似乎暗示现在这是理想的行为,虽然它当然可以用类型图改变......?
答案 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。