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 Réponses :
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); }
Vous devez utiliser qui vous donnera de très beaux messages d'erreur vous indiquant quelles interfaces ne sont pas satisfaites. Si vous avez besoin de surcharger la fonction et que vous avez une version disponible uniquement pour une combinaison de certaines interfaces, vous pouvez également utiliser qui fera la fonction disparaître em> à partir de l'ensemble de la surcharge lorsque la configuration de l'interface n'est pas remplie. p> p> static_assert code> pour vérifier les types dans la fonction:
activer_if code>: p>
Est-ce que static_assert code> disponible dans la langue pré-C ++ 11?
Oui: BOOST_STICTIC_ASSERT_MSG (V, MSG)
Vous pouvez écrire une classe de vérification d'interface à l'aide d'héritage variadidique récursif: par exemple: p> Notez que check_interfaces code> 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. p> p>
Juste pour vous donner un petit goût de C ++ 11:
type unique sans récursion: p> deux types mais sans récursion: p> < Pré> xxx pré> p>
Voulez-vous dire et combinaisons ou combinaisons?
Corrigez-moi si je me trompe, mais pas vos fonctions abstraites doivent être marquées
virtuel code> ainsi que être
= 0 code>?
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 code>
. Peut être utilisé en combinaison avecstd :: activer_if code> a >.
Pourquoi avez-vous besoin
DOSOMODIAT code> pour obtenir de nombreuses interfaces à la fois? Vos problèmes pourraient faire allusion à une faille de conception.