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
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.
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;
}
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
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;
}
- 1. Zwei Arrays für zwei Werte
- 2. Wie zwei Transfer ein Dimensionsdaten zu zwei zwei Dimensionen
- 3. Eine App, zwei Comps, zwei verschiedene Erscheinungsbilder
- 4. Get Rotationsmatrix zwischen zwei zwei Transformationsmatrizen (XNA)
- 5. zwei Taste zum Öffnen zwei neue Aktivität
- 6. Vergleichen Sie zwei Objekte nach zwei Kriterien
- 7. Beziehung zwischen zwei Schnittstellen und zwei Klassen.
- 8. Zwei Filter auf zwei Tabellen mit
- 9. Übereinstimmende zwei Felder zwischen zwei Dateien AWK
- 10. 'zwei' Regulärer Ausdruck zwischen zwei regulären Ausdrücken
- 11. C# Zwei-Klassen und zwei Tabellen verknüpfen
- 12. Zwei verschiedene adUnit ID von zwei Konten
- 13. MySQL JOIN zwei Tabellen an zwei Stellen
- 14. Zwei Primärschlüssel
- 15. Wie zwei
- 16. Replace zwei
- 17. Zwei web.configs?
- 18. Zwei Hauptfunktionen
- 19. Kann ich IEnumerable nach zwei Booleschen Kriterien ohne zwei Abfragen in zwei aufteilen?
- 20. Pyspark: Berechnung Summe von zwei correspoding Säulen, basierend auf Bedingungen von zwei Spalten in zwei RDDs
- 21. Definieren Sie zwei neue Variablen basierend auf den zwei größten absoluten Werten in zwei Zeilen
- 22. Zwei Firewalls mit zwei login_form und zwei verschiedenen AuthenticationSuccessHandlern, aber nur einer für beide
- 23. Lösen System von zwei Gleichungen mit zwei Unbekannten
- 24. Wie verknüpfe ich zwei Tabellen aus zwei verschiedenen Datenbanken?
- 25. Umkehren einer Zeichenfolge zwei char durch zwei char
- 26. Wie man zwei Objekte mit zwei Zeigern berührt/löst
- 27. Abfrage zwei Tabellen mit Laravel und zwei WHERE Bedingungen
- 28. Freigabeliste zwischen zwei Funktionen in zwei Klassen in android
- 29. Android gradle zwei verschiedene Abschussaktivitäten für zwei verschiedene Produkte Aromen
- 30. Verbinden von zwei separaten Benutzersystemen auf zwei verschiedenen Apps
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