2012-01-23 4 views
2

Я думаю, что мне что-то не хватает, надеюсь, кто-то может помочь. Скажем, у меня есть класс C++ объявленного со следующими конструкторами:Конструкторы SWIG и C++

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

После создания простого SWIG интерфейс файла, что-то вроде:

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

и создания коды оболочки для Python, я могу сделать это:

>>> 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.

С наилучшими пожеланиями Jakob Simon-Gaarde

+0

Похоже, что Python не поддерживает неявные преобразования (или SWIG не превращает неявные конструкторы в неявные преобразования) –

ответ

1

Python не выглядит на типы аргументов, переданных в функцию, чтобы определить, какие функции для вызова (игнорирование метода отправки). Поэтому я не думаю, что вы можете заставить python делать то, что вы хотите. Swig, с другой стороны, когда он знает о перегрузке, может помочь вам. Вы можете получить то, что хотите, если перегрузите append().

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

Может быть другое решение, но это, похоже, работает на меня.

+0

Спасибо, это было то, чего я боялся, было бы неплохо, если бы SWIG предложил какой-то макрос для расширения нескольких расширения метода для списка сигнатур методов C++, например, сообщать SWIG, что% extend {void append (CPP_TYPE_LIST) {...}}, знаете ли вы, возможно ли это? –

Смежные вопросы