J'utilise deux bibliothèques tierces, qui implémentent leur propre classe de vecteurs 2D. Malheureusement, je dois travailler avec les deux, alors est-ce que je peux écrire des fonctions "ami" de sorte que l'une puisse automatiquement être convertie en l'autre quand j'essaie de les utiliser dans des fonctions de l'autre bibliothèque?Auto-cast deux cours de tiers?
Répondre
Les opérateurs de conversion doivent être des fonctions membres.
Dans des situations comme celle-ci, j'ai utilisé un modèle de fonction convert<X,Y>
, avec des spécialisations ou des surcharges complètes pour chaque paire de types que je veux "lancer". Dans ce cas, vous n'avez pas besoin du modèle, juste deux surcharges, une dans chaque direction, car pour un X donné, il n'y a qu'une seule chose à laquelle vous le convertissez.
Ensuite, il est rarement difficile de basculer entre l'un et l'autre (l'exception notable étant lorsque vous utilisez un code de modèle qui nécessite qu'un type de paramètre soit convertible en un autre). Vous pouvez facilement voir dans le code la limite entre les deux API, sans introduire beaucoup de bruit. La raison pour laquelle j'ai souvent eu cette situation est l'écriture de couches d'abstraction d'OS - le système d'exploitation sous-jacent a un ensemble d'objets ou de poignées opaques pour différents concepts d'OS et l'API que vous implémentez en a un autre. ConverthostMutexToGuestMutex, ConvertGuestMutexToHostMutex, ConvertHostSocketOptsToGuestSocketOpts etc ... L'inconvénient est l'habituel avec une surcharge généralisée, que ce n'est pas nécessairement évident où les fonctions sont réellement définies.
Auto -cast ne semble pas être possible. Vous pouvez définir la fonction de conversion globale et l'appeler explicitement. Pourriez-vous afficher la définition de ces classes? Peut être un truc avec l'héritage sera possible.
Quelque chose comme ça, mais ce n'est pas auto-cast:
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;
}
Avez-vous vraiment besoin des définitions? Ils stockent les valeurs x et y, c'est à peu près tout. http://doc.trolltech.com/4.5/qvector.html et http://linuxuser.at/elements/doc/box2d/structb2_vec2.htm. Ce n'est pas difficile de convertir de l'un à l'autre, QVector (b2vec.x, b2vec.y) fondamentalement ... juste voulu un joli caractère syntaxique. – mpen
Une façon serait de tirer de ces cours et fournir aux opérateurs de conversion pour l'autre. Mais alors vous devez utiliser les objets de la classe dérivée à travers votre code. Voici un exemple de code:
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. Mise en page en cours de rendu deux fois
- 2. Extraits de Visual Studio tiers
- 3. Comment inclure des rowcounts filtrés provenant de deux autres tables dans une requête d'un tiers?
- 4. qt/wxwidgets composants tiers?
- 5. Programme de ligne de commande Windows tiers?
- 6. Comment interroger deux tables selon que l'enregistrement existe ou non dans un tiers?
- 7. Activation de la consignation d'un composant tiers
- 8. Implémentations d'identifiants de types uniformes tiers?
- 9. Exécution de logiciels tiers non approuvés
- 10. .NET - Contrôle de grille tiers - Remplissage automatique
- 11. Outils de suivi tiers pour SQL Server
- 12. Programmes d'installation tiers Qt 4.5
- 13. Intégrer outil tiers avec vb.net
- 14. Contrôle de la taille de l'image de script tiers
- 15. Facebook connect et les cookies tiers?
- 16. utiliser off sms gateway tiers api
- 17. Encapsulation et personnalisation d'un contrôle WPF tiers
- 18. Tests automatisés de gestionnaires de composants dans un tiers Javascript
- 19. ma tentative de cours
- 20. Cours de design .NET?
- 21. Recommandation pour le contrôle d'édition/de coloration syntaxique tiers - WinForms
- 22. Composant de répertoire actif tiers avec fonctionnalité intégrée
- 23. Invite Suggestions de contrôles tiers pour le développement d'asp.net
- 24. SQL Server Reporting Services: contrôles de graphique tiers?
- 25. Java - Implémentations de référence vs fournisseurs tiers fournis
- 26. m2eclipse Indexation de fichiers JAR tiers provenant du référentiel Maven
- 27. Gestion des mots de passe tiers avec intégration complète
- 28. Oracle curseur en cours d'exécution à travers le dernier élément deux fois
- 29. En cours d'exécution Penser Sphinx dans deux applications sous le passager
- 30. Simulateur de l'iPhone en cours d'exécution
Votre première phrase était plus ou moins la réponse que je recherchais, et votre solution semble mieux que de créer une autre classe qui ne serait utilisée que pour un instant. Merci :) – mpen