2009-08-17 8 views
1

Ich verwende zwei Bibliotheken von Drittanbietern, die beide ihre eigene 2D-Vektorklasse implementieren. Leider muss ich mit beiden arbeiten, also kann ich sowieso einige "Freund" -Funktionen schreiben, so dass man automatisch in die andere konvertiert werden kann, wenn ich versuche, sie in Funktionen aus der anderen Bibliothek zu verwenden?Auto-Cast zwei 3rd-Party-Klassen?

Antwort

1

Konvertierungsoperatoren müssen Elementfunktionen sein.

In Situationen wie diesem habe ich eine convert<X,Y> Funktionsvorlage mit vollständigen Spezialisierungen oder Überladungen für jedes Paar von Typen verwendet, die ich "werfen" möchte. In diesem Fall würden Sie die Vorlage nicht benötigen, nur zwei Überladungen, eine in jeder Richtung, denn für ein gegebenes X gibt es nur eine Sache, in die Sie es konvertieren.

Dann ist es selten ein Problem, zwischen den beiden zu wechseln (die Ausnahme ist, wenn Sie Template-Code verwenden, bei dem ein Parametertyp in einen anderen Parameter konvertiert werden muss). Sie können im Code die Grenze zwischen den beiden APIs leicht sehen, ohne viel Rauschen zu verursachen.

Der Grund, warum ich diese Situation hatte, ist das Schreiben von Betriebssystemabstraktionsschichten - das zugrundeliegende Betriebssystem hat eine Reihe von Objekten oder undurchsichtigen Handles für verschiedene Betriebssystemkonzepte, und die API, die Sie implementieren, hat eine andere. Es ist viel netter, einfach von einem Satz Konzepte in den anderen zu "konvertieren", ohne ConvertHostMutexToGuestMutex, ConvertHostSocketOptsToGuestSocketOpts usw. zu haben. Der Nachteil ist der übliche mit weit verbreiteter Überladung, dass es nicht unbedingt offensichtlich ist, wo die Funktionen tatsächlich definiert sind.

+0

Ihr erster Satz war mehr oder weniger die Antwort, nach der ich suchte, und Ihre Lösung scheint besser zu sein, als eine andere Klasse zu erschaffen, die nur für einen Augenblick verwendet wird. Vielen Dank :) – mpen

2

Auto -cast scheint nicht möglich zu sein. Sie könnten die globale Konvertierungsfunktion definieren und explizit aufrufen. Könnten Sie die Definition dieser Klassen veröffentlichen? Vielleicht ist ein Trick mit Vererbung möglich.

So etwas wie dies, aber es ist nicht auto-Besetzung:

class T1 {}; 
class T2 {}; 

class UnionType : public T1, public T2 
{ 
public: 
    UnionType(const T1& val) {} // real storing should be here 
    UnionType(const T2& val) {} // real storing should be here 

    operator T1() { T1 t; return t; } // real conversion should be here 
    operator T2() { T2 t; return t; } // real conversion should be here 
}; 

int main() 
{ 
    T1 t; 
    T2 t2 = UnionType(t); 

    return 0; 
} 
+0

Brauchen Sie wirklich die Definitionen? Sie speichern x und y Werte, das ist es. http://doc.trolltech.com/4.5/qvector.html und http://linuxuser.at/elements/doc/box2d/structb2_vec2.htm. Es ist nicht schwer, von einem zum anderen zu konvertieren, QVector (b2vec.x, b2vec.y) im Grunde ... wollte nur etwas syntaktische Schönheit. – mpen

1

Eine Möglichkeit, aus diesen Klassen abzuleiten wäre und Konvertierungsoperator für sie sorgen. Aber dann müssen Sie die abgeleiteten Klassenobjekte durch Ihren Code verwenden. Hier ist ein Beispielcode:

class ThirdParty1 
{ 
    public: 
     ThirdParty1(int x, int y) : m_x(x), m_y(y) 
     { 
     } 
     int getX() const { return m_x; } 
     int getY() const { return m_y; } 

    private: 
     int m_x; 
     int m_y; 
}; 

class ThirdParty2 
{ 
    public: 
     ThirdParty2(int x, int y) : m_x(x), m_y(y) 
     { 
     } 
     int getX() const { return m_x; } 
     int getY() const { return m_y; } 

    private: 
     int m_x; 
     int m_y; 
}; 

template<class Type, class AdaptedType> 
class TP1Adaptor : public Type 
{ 
    public: 
     TP1Adaptor(int x, int y): Type(x,y) 
     { 
     } 
     operator AdaptedType() 
     { 
      return AdaptedType(getX(),getY()); 
     } 


}; 

typedef TP1Adaptor<ThirdParty1, ThirdParty2> First2D; 
typedef TP1Adaptor<ThirdParty2, ThirdParty1> Second2D; 

void f(ThirdParty1 tp) 
{ 
} 


void f1(ThirdParty2 tp) 
{ 
} 


int main() 
{ 
    First2D f(0,0); 
    f1(f); 


    return 0; 
} 
+0

Ja ... das wollte ich vermeiden. Ich müsste alles, was sie bereits haben, neu implementieren. – mpen

+0

Dann denke ich nur an eine globale Funktion, die die Konvertierungen durchführt. – Naveen

Verwandte Themen