IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Template specialization pour classes h�rit�es


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    26
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 26
    Par d�faut Template specialization pour classes h�rit�es
    Bonjour,

    Pouvez-vous me dire si la sp�cialisation de templates peut m'aider pour mon cas ?

    J'ai une classe template dont je veux que le second argument soit obligatoirement d�riv� d'une certaine classe, comment puis-je m'y prendre ?

    Ci dessous, un exemple.

    Merci et meilleures salutations,
    Gab

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class A
    {
    };
     
    class B : public A
    {
    };
     
     
    // J'aimerais que le type T2 soit obligatoirement une classe dérivée de la classe A (la classe B par exemple)
    template<class T1, class T2>
    class MonTemplate
    {
    	//...
    };

  2. #2
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Bonjour,

    Est-ce qu'un code comme �a fonctionnerait (je viens d'y penser sans jamais avoir essay� une telle chose)
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    class A {};
    class B : public A {};
    template< class T1, class T2 >
    class Template
    {
      A* monA;
      Template() {monA = new T2;};
    };
    A priori, tel que je l'imagine, si T2 n'est pas d�riv� de A (ou directement A), la compilation devrait �chouer.

    Sinon, as-tu vraiment besoin d'un template pour cela ?
    Ne peux-tu avoir uniquement un membre � initialiser ? Ce qui aurait un effet similaire � ce que j'imagine plus haut.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    26
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 26
    Par d�faut
    Citation Envoy� par Bousk Voir le message
    Est-ce qu'un code comme �a fonctionnerait (je viens d'y penser sans jamais avoir essay� une telle chose)
    A priori, tel que je l'imagine, si T2 n'est pas d�riv� de A (ou directement A), la compilation devrait �chouer.
    �a pourrait marcher mais suivant le compilateur, peut-�tre que �a ne mercherait pas :-/

    Entre temps j'ai eu une autre id�e, dis moi ce que tu en penses
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class B : public A
    {
        static void bidon() {}
    }
     
    template<class T1, class T2>
    class MonTemplate
    {
    	MonTemplate()
    	{
    		T2::bidon(); // plantage si non hérité de B
    	}
    };

    Citation Envoy� par Bousk Voir le message
    Sinon, as-tu vraiment besoin d'un template pour cela ?
    Ne peux-tu avoir uniquement un membre � initialiser ? Ce qui aurait un effet similaire � ce que j'imagine plus haut.
    En fait mon cas est beaucoup plus compliqu�, j'ai une structure de classes assez grande, dont certains templates h�ritent d'autres et doivent en prendre d'autres en param�tres (sur fond de polymorphisme ^^)

    Merci

  4. #4
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Citation Envoy� par _56ka Voir le message
    �a pourrait marcher mais suivant le compilateur, peut-�tre que �a ne mercherait pas :-/
    Pourquoi suivant le compilateur ? Je ne vois pas ce qu'il changerait l�. Tout compilateur retourne une erreur si A* a = new B; si B n'est pas d�riv� de A. Et inversement il acceptera une telle �criture.

    Citation Envoy� par _56ka Voir le message
    Entre temps j'ai eu une autre id�e, dis moi ce que tu en penses
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class B : public A
    {
        static void bidon() {}
    }
     
    template<class T1, class T2>
    class MonTemplate
    {
    	MonTemplate()
    	{
    		T2::bidon(); // plantage si non hérité de B
    	}
    };
    En fait �a reprend exactement le m�me principe que j'imaginais^^
    Ou en tous cas dans mon esprit c'est similaire.
    Ca ne compile pas ? Il y a une erreur ?
    Le meilleur moyen de savoir �a reste de tenter de compiler.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  5. #5
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations professionnelles :
    Secteur : Sant�

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par d�faut
    Pour faire les choses proprement, je conseille la fonction is_base_of du C++11 (ou de boost.type_traits), qui permet de tester si une classe h�rite d'une autre classe : http://en.cppreference.com/w/cpp/types/is_base_of ou http://www.boost.org/doc/libs/1_49_0...s_base_of.html

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    26
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 26
    Par d�faut
    Citation Envoy� par Bousk Voir le message
    Pourquoi suivant le compilateur ?
    Suivant la config du compilateur je voulais dire
    Il y a surement un param�tre trop permissif qui laisserait passer �a entre les gouttes ^^

    Citation Envoy� par Bousk Voir le message
    En fait �a reprend exactement le m�me principe que j'imaginais^^
    Ou en tous cas dans mon esprit c'est similaire.
    On est ali�n�s pareil, c'est un point positif

    Citation Envoy� par Bousk Voir le message
    Ca ne compile pas ? Il y a une erreur ?
    Le meilleur moyen de savoir �a reste de tenter de compiler.
    Alors je n'ai pas test� ta solution vu que j'ai eu une id�e entre temps mais ma proposition fonctionne


    Citation Envoy� par gbdivers Voir le message
    Pour faire les choses proprement, je conseille la fonction is_base_of du C++11 (ou de boost.type_traits), qui permet de tester si une classe h�rite d'une autre classe
    Merci pour ta contribution, je ne connaissais pas cette fonction ^^
    Par contre, le probl�me est que is_base_of g�n�re une erreur � l'ex�cution et moi j'aimerais qu'elle se d�clare � la compilation.

  7. #7
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations professionnelles :
    Secteur : Sant�

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par d�faut
    Citation Envoy� par _56ka Voir le message
    Par contre, le probl�me est que is_base_of g�n�re une erreur � l'ex�cution et moi j'aimerais qu'elle se d�clare � la compilation.
    Non, c'est bien � la compilation
    Tu peux utilis� un static assert pour lancer une erreur si is_base_of est faux

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    26
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 26
    Par d�faut
    Ah ce serait donc un template online ou un truc du genre ? cool
    C'est quoi un static assert exactement ? On peut les utiliser sans Boost ?

  9. #9
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations professionnelles :
    Secteur : Sant�

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par d�faut
    Oui, avec C++11 (gcc > 4.3)

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    // définition : static_assert(expression, string);
    #include <type_traits>
    static_assert(is_base_of<A, B>::value, "A not base of B");

  10. #10
    Membre exp�riment� Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    D�cembre 2005
    Messages
    170
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activit� : Amateur

    Informations forums :
    Inscription : D�cembre 2005
    Messages : 170
    Par d�faut
    Citation Envoy� par _56ka Voir le message
    Entre temps j'ai eu une autre id�e, dis moi ce que tu en penses
    Je l'utilise dans mon code actuel, j'ai aucun probl�me. Test� depuis deux mois GCC/MSVC

  11. #11
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Attention, selon ce que tu veux en faire, is_base_of peut retourner des faux positifs. Ainsi une classe de base priv�e retournera vrai.

    Mais bon, � la base, je n'aime pas trop imposer des contraintes si fortes sur mes templates...
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

Discussions similaires

  1. Templates et constructeurs de classe h�rit�es
    Par Matthieu Brucher dans le forum Langage
    R�ponses: 14
    Dernier message: 28/06/2014, 00h00
  2. Liens entre des classes h�rit�es
    Par qwiqwi dans le forum C++
    R�ponses: 12
    Dernier message: 09/02/2006, 15h36
  3. R�ponses: 2
    Dernier message: 04/12/2005, 21h10
  4. [Template] methode template d'une classe pas template
    Par bigquick dans le forum Langage
    R�ponses: 8
    Dernier message: 25/03/2005, 15h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo