2012-01-23 18 views
2

私はここで何かを見逃しているに違いないと思います。私はこれを行うことができますSWIGとC++のコンストラクタ

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

とPythonのラッパー・コードを作成:、のようなものをシンプルなSWIGインタフェースファイルを作成した後

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

: のは、私は次のコンストラクタを宣言したC++クラスがあるとしましょう:

>>> 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 &' 

Value(const char * value)コンストラクタを使用する方法はわかっていますが、appendメソッドに渡される文字列をValueオブジェクトにフィード/変換する方法を理解するにはどうすればよいですか。 ヤコブサイモン・Gaarde

+0

Pythonは暗黙的な変換をサポートしていないようです(またはSWIGは暗黙的なコンストラクタを暗黙的な変換に変換しません) –

答えて

1

Pythonは(メソッドディスパッチを無視して)を呼び出すように機能するかを決定するための関数に与えられた引数の種類を見ていない

よろしく。だから私は、あなたが望むことを行うためにPythonを手に入れることはできないと思います。一方、あなたが過負荷を認識しているときにあなたを助けることができる。あなたがappend()をオーバーロードするなら、あなたが望むものを得ることができます。

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

もう少し解決策があるかもしれませんが、これは私にとってはうまくいくようです。

+0

SWIGが複数のマクロを拡張するために何らかの種類のマクロを提供してくれたことを感謝しましたSWIGに%extend {void append(CPP_TYPE_LIST){...}}のようなC++メソッドシグネチャのリストのメソッド拡張が可能かどうか知っていますか? –