J'ai prévu d'écrire une couche d'abstraction API pour mon moteur de rendu. Les deux API que je veux inclure sont D3D11 et D3D12. J'ai donc commencé par écrire des interfaces et leurs implémentations respectives pour chaque API.Couche d'abstraction de l'API - évite le mélange des interfaces API
L'extrait de code ci-dessous examplifies ceci:
class IDevice
{
//... (pure) virtual methods
};
class CD3D11Device : public IDevice
{
//... virtual method implementations
};
class CD3D12Device : public IDevice
{
//... virtual method implementations
};
Jusqu'à présent, si bon. Maintenant, au problème réel: Si j'ai une autre interface avec une méthode qui nécessite un IDevice*
comme paramètre, comment puis-je m'assurer que le «bon» périphérique est passé?
class ISomeClass
{
public:
virtual void foo(IDevice* pDev) = 0;
};
class CD3D11SomeClass : public ISomeClass
{
public:
virtual void foo(IDevice* pDev) override
{
// should only be passed CD3D11Device
}
};
class CD3D12SomeClass : public ISomeClass
{
public:
virtual void foo(IDevice* pDev) override
{
// should only be passed CD3D12Device
}
};
Je sais que je pourrais appeler dynamic_cast
sur les pointeurs IDevice*
chaque fois et vérifier nullptr
mais qui est pénible et coûteuse en ce qui concerne la performance.
Y at-il une solution élégante à ce problème? Est-ce que quelqu'un d'entre vous sait comment les moteurs de jeu professionnels/commerciaux font face à cela?
Vous ne devez pas vous soucier du type 'IDevice' qui est passé. C'est tout le point des interfaces abstraites. – juanchopanza
J'ai mis à jour parce que beaucoup de gens essaient de faire ce genre de chose avec leurs moteurs graphiques. Mon expérience est un peu différente cependant. J'essaie de coller à une version de l'API avec une version donnée, évitant ainsi tous ces problèmes. Chaque API que vous prenez en charge double le nombre de tests à effectuer. – Robinson