Как создать псевдоним для класса Python через Swig? - PullRequest
3 голосов
/ 29 декабря 2010

Я создал библиотеку C ++ и успешно использовал swig, чтобы сделать ее доступной через python. Шаблонирование интенсивно используется в библиотеке, и каждый тип шаблона отображается в свой собственный класс python с помощью swig:

%template(Imageint) Image<int>;
%template(Imagedouble) Image<double>;

Однако мне бы очень хотелось, чтобы Python использовал шаблон по умолчанию, такой, что

a = Image("filename")

создает Image<double> без необходимости всегда вводить

a = Imagedouble("filename")

Документация Swig гласит:

Директива% template не должна быть используется, чтобы обернуть тот же шаблон создание более одного раза в та же сфера Это создаст ошибка. Эта ошибка вызвана тем, что расширение шаблона приводит к двум идентичные классы с тем же именем. Это создает таблицу символов конфликт. Кроме того, это, вероятно, больше эффективно обернуть только определенный создание только один раз для того, чтобы уменьшить вероятность вздутия кода.

Итак, чтобы избежать конфликта таблицы символов, я попытался

%rename(Image) Image<double>;
%template(Imageint) Image<int>;
%template(Imagedouble) Image<double>;

в файле интерфейса. Однако Swig жалуется на то, что изображение переопределено.

Каков наилучший способ создать псевдоним, чтобы Image и Imagedouble ссылались на C ++ Image<double>? Большое спасибо за любую помощь, которую вы можете предоставить.

-Josh

1 Ответ

7 голосов
/ 29 декабря 2010

В случае, если это поможет кому-то в будущем, способ сделать то, что описано выше, это добавить следующее в файл интерфейса:

%pythoncode %{
Image = Imagedouble
%}

Я не понял, что есть способ написать стандарткод Python в файле интерфейса.

...