7
votes

Héritage multiple des interfaces en C ++

J'ai une interface d'objet et une collection ouverte des interfaces d'un objet dérivé pourraient souhaiter prendre en charge.

class Object1 : public boost::mpl::inherit<IObject, IMutable, ILockable>::type
class Object2 : public boost::mpl::inherit<IObject, ILockable, ICertifiable>::type
class Object3 : public IObject

void doSomething(boost::mpl::inherit<IObject, ILockable>::type object);

doSomething( Object1() )  // Fails even though Object1 derives from IObject and ILockable.
doSomething( Object2() )  // Fails even though Object2 derives from IObject and ILockable.


5 commentaires

Voulez-vous dire et combinaisons ou combinaisons?


Corrigez-moi si je me trompe, mais pas vos fonctions abstraites doivent être marquées virtuel ainsi que être = 0 ?


Je suppose que les modèles d'utilisation sont la mauvaise réponse?


Dans la nouvelle norme C ++ 11, il existe de nombreux nouveaux Type Traits , comme Par exemple std :: is_base_of . Peut être utilisé en combinaison avec std :: activer_if .


Pourquoi avez-vous besoin DOSOMODIAT pour obtenir de nombreuses interfaces à la fois? Vos problèmes pourraient faire allusion à une faille de conception.


5 Réponses :


1
votes

Peut-être que ce n'est pas le moyen le plus élégant, car il est fait avec C ++ 03 Syntaxe

template <typename T, typename TInterface1, typename TInterface2, typename TInterface3 >
void magic_interface_combiner(T& t)
{
    TInterface1& tIfClassImplementsInterface = static_cast<TInterface1&>(t);
    TInterface2& tIfClassImplementsInterface = static_cast<TInterface2&>(t);
    TInterface3& tIfClassImplementsInterface = static_cast<TInterface3&>(t);
}


0 commentaires


3
votes

Vous pouvez écrire une classe de vérification d'interface à l'aide d'héritage variadidique récursif: xxx

par exemple: xxx

Notez que check_interfaces a une empreinte d'un pointeur par interface vérifiée; En effet, il effectue une effacement de type sur le type déclaré de l'argument réel.


0 commentaires

1
votes

Juste pour vous donner un petit goût de C ++ 11:

type unique sans récursion: xxx

deux types mais sans récursion: < Pré> xxx


0 commentaires

2
votes

Solution utilisant std :: activer_if et std :: is_base_of : xxx


0 commentaires