2012-01-23 62 views
2

我想我必须在这里失去一些东西,我希望有人能帮助。 比方说,我有以下构造函数声明的C++类:SWIG和C++构造函数

%module(naturalvar=1) Value 
%{ 
#include "value.h" 
%} 
%include "value.h" 

而对于Python的我能做到这一点创建包装代码:

class Value { 
public: 
    Value(); 
    Value(const char *val); 
    void append(const Value &val); 
private: 
    ... 
}; 

创建一个简单的SWIG接口文件,喜欢的东西后:

>>> import Value 
>>> v1 = Value.Value() 
>>> v2 = Value.Value("test") 
>>> v1.append(v2) 
>>> v1.append(Value.Value("test")) 

,但我不能做到这一点:

>>> v1.append("test") 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 

/home/jakob/dev/test/Value.py in append(self, *args) 
    298  def resize(self, *args): return _Value.Value_resize(self, *args) 
    299  def isValidIndex(self, *args): return _Value.Value_isValidIndex(self, *args) 
--> 300  def append(self, *args): return _Value.Value_append(self, *args) 
    301  def get(self, *args): return _Value.Value_get(self, *args) 
    302  def removeMember(self, *args): return _Value.Value_removeMember(self, *args) 

TypeError: in method 'Value_append', argument 2 of type 'Value const &' 

显然它知道如何使用值(为const char *值)构造的,但我怎么让它明白传递给append方法字符串应喂/转换为值对象。

问候 雅各布·西蒙Gaarde

+0

它看起来像Python不支持隐式转换(或痛饮不转隐构造成隐式转换) –

回答

1

Python不看类型的传递给函数来确定参数调用哪个函数(忽略方法分派)。所以我不认为你可以让python做你想做的事。另一方面,Swig在意识到超载时可以帮助你。如果你重载append(),你也可以得到你想要的。

class Value { 
public: 
    Value() { } 
    Value(const char *val) { } 
    void append(const Value &val) { } 
    void append(const char *val) { } 
}; 

可能还有另一种整洁的解决方案,但这似乎适用于我。

+0

谢谢,这是我所担心的那样,这将是很好但如果痛饮提供某种宏观的扩大多C++方法签名列表的方法扩展,比如告诉SWIG%extend {void append(CPP_TYPE_LIST){...}},你知道这是否可能吗? –