【问题标题】:Type checking and overloaded methods in SWIGSWIG 中的类型检查和重载方法
【发布时间】:2017-09-18 20:07:28
【问题描述】:

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

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

但是,如果我尝试 x('Hi', 'Hello') swig 之类的操作,不会将 'Hello' 转换为布尔值,所以我会得到 NotImplementedError: Wrong number or type of arguments for overloaded function

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

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

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

上面的链接似乎表明这是现在想要的行为,尽管它“当然”可以用类型映射来改变......?

【问题讨论】:

  • 在您的 C++ 代码中,使用 x("Hi", "Hello") 调用 X(const std::string&, bool) 会起作用,因为 string-literals 可以隐式转换为 bool。 SWIG 没有考虑到这一点,也不应该考虑到这一点。添加正确的 X(const std::string&, const std::string&) 重载并再次生成绑定..
  • 重点是 Python 程序中的第二个参数应该被允许为if(b): 将持有的任何东西。我无法为每种可能的类型添加正确的重载!
  • 我想我现在明白你的问题了。如何编写自定义“类型映射”并将其应用于特定的函数签名。或extending it
  • 谢谢!据我所见,类型映射仅处理单个参数,因此您无法将其与特定签名匹配

标签: python c++ swig


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    最后,我是这样修复的(可能会有后果...):

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

    第一个 typemap 告诉 swig,在 Python 中,一切都可以被视为布尔值。 第二个来自@flexo 的答案,将匹配的参数转换为 C++ 布尔值。

    【讨论】:

      猜你喜欢
      • 2012-11-10
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 1970-01-01
      • 2016-09-29
      • 1970-01-01
      相关资源
      最近更新 更多