Конструкторы SWIG и C ++ - PullRequest
2 голосов
/ 23 января 2012

Я думаю, что я что-то здесь упускаю, я надеюсь, что кто-то может помочь.Допустим, у меня есть класс 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), но как мне сделатьон понимает, что строка, переданная методу добавления, должна быть передана / преобразована в объект Value.

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

1 Ответ

1 голос
/ 23 января 2012

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

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

Возможно, есть и другое более точное решение, но мне кажется, что это работает.

...