2010-12-28 8 views
3

Ich habe eine C++ - Bibliothek erstellt und Swig erfolgreich verwendet, um es über Python zugänglich zu machen. Templating ist stark in der Bibliothek verwendet, und jeder Vorlagentyp wird in seine eigenen Python-Klasse abgebildet durch swig wie so:Wie erstelle ich einen Alias ​​für eine Python-Klasse durch Swig?

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

Allerdings würde ich wirklich gerne habe eine ‚default‘ Vorlage von Python verwendet, so dass

a = Image("filename") 

instanziiert Image<double> ohne immer mit

a = Imagedouble("filename") 

Swig Dokumentation Zustände geben:

Die% Vorlage Richtlinie soll nicht verwendet die gleiche Vorlage Instanziierung mehr als einmal in dem gleichen Umfang zu wickeln. Dies wird einen Fehler erzeugen. Dieser Fehler wird verursacht, weil die Vorlagenerweiterung in zwei identische Klassen mit demselben Name resultiert. Dies erzeugt eine Symboltabelle Konflikt. Außerdem ist es wahrscheinlich mehr effizient, nur eine spezifische Instanziierung nur einmal zu umhüllen, um das Potenzial für Code Bloat zu reduzieren.

So die Symboltabelle, Konflikte zu vermeiden, habe ich versucht,

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

in der Schnittstellendatei. Swig beschwert sich jedoch darüber, dass Image neu definiert wird.

Was ist der beste Weg, um einen Alias ​​so zu machen, dass Image und Imagedouble beide auf C++ verweisen? Vielen Dank für Ihre Hilfe.

-Josh

Antwort

7

Falls dies jemand in der Zukunft hilft, die Art und Weise, was zu tun ist, oben beschrieben ist das folgende zu der Schnittstellendatei hinzuzufügen:

%pythoncode %{ 
Image = Imagedouble 
%} 

ich nicht erkennen, dass es war eine Möglichkeit, Standard-Python-Code in die Schnittstellendatei zu schreiben.

+0

Was ich vorschlagen wollte, nicht vertraut mit SWIG, war die Namensvergabe in Python. Es ist also schön, dass swig es einfach macht, genau das zu tun. – kindall

+0

Vielen Dank für das Schreiben der Antwort auf Ihre eigene Frage. Ich habe auch Templates wie Foo und wollte Foo als Standard für den Namen 'Foo' in Python verwenden. –

Verwandte Themen