2017-09-18 30 views
2

我有一個C++方法,可以調用x(const std::string &a, bool b=true)x(const SomeClass &object, bool b=true)SWIG中的類型檢查和重載方法

在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

上面的鏈接似乎在暗示這是現在所期望的行爲,雖然它可以「當然」與類型表變化......?

+1

在您的C++代碼中,使用'x(「Hi」,「Hello」)調用'X(const std :: string&,bool)'會起作用,因爲* string-literals *可以隱式轉換爲'bool '。 SWIG沒有考慮到這一點,不應該這樣做。添加一個正確的'X(const std :: string&,const std :: string&)'重載並重新生成綁定。 – WhiZTiM

+0

重點在於Python程序中的第二個參數應該被允許爲_anything_, '如果(b):'會成立。我無法爲每種可能的類型添加正確的重載! –

+2

我想我現在明白你的問題了。如何編寫自定義「類型映射表」並將其應用於該特定函數簽名?或者[擴展它](https://stackoverflow.com/a/35257318/1621391) – WhiZTiM

回答

1

最後,我固定它是這樣的(可能有後遺症...):

#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++布爾。

2

你可以寫痛飲類型映射調用Python對象協議功能PyObject_IsTrue對於任何像這樣的輸入:

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