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

Langage C++ Discussion :

spécialisation de template en fonction de l'héritage


Sujet :

Langage C++

  1. #21
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Alp Voir le message
    Les macros de MPL ne gèrent pas ça ?
    Je ne sais pas. Mais j'aurais préférer éviter boost. Et leur code est tellement dispersé, que c'est pas évidant de savoir ce qu'ils font...
    Donc c'est pas triviale

  2. #22
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    C'est peut-être stupide, mais à quoi serve ces lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      static void Constraints(D* p) { B* pb = p; pb = p; } 
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      IsDerivedFrom() { void(*p)(D*) = Constraints; }
    };
    ?!?(surtout la première qui fait la même instruction 2 fois ><) ?
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  3. #23
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par Alp Voir le message
    Une fonction membre template
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template <typename T> void f(const T& t);
    n'est pas une fonction membre. f<int>, f<char> etc le seraient. Donc c'est un peu plus tricky. Il faudrait demander sur comp.lang.c++.moderated ça je pense. J'ai p-ê une vague idée, je ferai un peu de recherches.
    C'est possible oui... J'ai pas le code sous la main, mais ça se fait.


    de toute façon, moi je dis que y'aura bientôt des réponses à toute les questions

    Pour la méthode pour checker si il existe une hiérarchie entre deux types y'a plus simple ... :

    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
    16
    17
    18
    19
     
    template <typename T, typename U>
    struct conversion_exists
    {
    	typedef char yes;
    	struct no { char dummy[2]; };
    	static T makeT(); // si T n'est pas copy constructible
     
    	static no tester(...);
    	static yes tester(U);
     
        public :
    	enum { exists = sizeof(yes) == sizeof(tester(makeT())) };
    	enum { existsBothway = exists && conversion<U,T>::exists };
    	enum { isSame = false };
    };
     
    // une spécialisation au cas où les deux types soit les mêmes.
    // deux spécialisations pour void.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  4. #24
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pour tester un lien de parenté il faudrait plutôt utiliser des pointeurs non ? Parce que là, ça teste toute conversion implicite. Donc entre int et long aussi, par exemple.

    Et sinon je crois que tu as une récursion infinie avec existsBothway
    Il faudrait passer un booléen en 3ème paramètre pour décider de faire l'appel ou pas.

  5. #25
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Ouai, j'ai fait un peu à l'arrache sur le fofo. Je m'en sert juste pour détecter tout type de conversion. Pour juste tester une hiérarchie c'est trivial avec un ajout de pointeur.
    Et non y'a pas de récursion infinie... (dans le deuxiéme cas on appel pas existsBothWay)

    Un booléen pour appel de quoi? C'était qu'un toy code hein.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  6. #26
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Et non y'a pas de récursion infinie... (dans le deuxiéme cas on appel pas existsBothWay)
    Qu'est-ce qui empêche cet appel ?

    Un booléen pour appel de quoi?
    C'était éventuellement pour stopper la récursion si nécessaire.

  7. #27
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par Laurent Gomila Voir le message
    Qu'est-ce qui empêche cet appel ?


    C'était éventuellement pour stopper la récursion si nécessaire.
    J'ai pas la norme sous les yeux. Mais t'arrives à me mettre le doute. Mais pour moi existsBothWay et isSame sont jamais instancié avec cet appel, d'où la non récursion. Que ça soit sur VS ou gcc ça passe.

    Mieux, si pour tester je remplace
    l'appel conversion<U,T>::exists par conversion<U,T>::existsBothWay, le compilo me le refuse. (type incomplet)
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  8. #28
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par yan Voir le message
    Je ne sais pas. Mais j'aurais préférer éviter boost. Et leur code est tellement dispersé, que c'est pas évidant de savoir ce qu'ils font...
    Donc c'est pas triviale
    OK... Mais si tu commences à avoir besoin de plus d'outils de ce genre, considérez de rajouter Boost aux deps de QExtend... Le code de Boost est robuste, testé, éprouvé, [...].

  9. #29
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    J'ai pas la norme sous les yeux. Mais t'arrives à me mettre le doute. Mais pour moi existsBothWay et isSame sont jamais instancié avec cet appel, d'où la non récursion. Que ça soit sur VS ou gcc ça passe.

    Mieux, si pour tester je remplace
    l'appel conversion<U,T>::exists par conversion<U,T>::existsBothWay, le compilo me le refuse. (type incomplet)
    Ah oui je viens de saisir. Ca roule alors.

  10. #30
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Bon ça va... tu m'as quand même fait douter. (pas assez pour que je fouille la norme par contre). Reste que t'avais raison pour les pointeurs. J'ai posté un peu vite.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  11. #31
    Invité
    Invité(e)
    Par défaut
    Mais dans ce cas il faut verifier si U n'est un void*.

    EDIT: Désolé ,je n'avais pas vu que le code continuait plus bas.

  12. #32
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    D'où les commentaires précisant les différentes spécialisation à fournir.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  13. #33
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Alp Voir le message
    OK... Mais si tu commences à avoir besoin de plus d'outils de ce genre, considérez de rajouter Boost aux deps de QExtend... Le code de Boost est robuste, testé, éprouvé, [...].
    J'y réfléchie t'inquiète Mais je ne suis pas le seul à décider.

    Puis je fait cela pour apprendre. SFINAE et moi on viens juste de se rencontrer. J'essaie de comprendre les possibilités.

    Je suis pas née avec un ordi et un manuel C++ comme vous. Pour dire, j'ai découvert que la virtualité était héréditaire que depuis 1 mois
    Putain de prof et SSII qui nous apprend à faire du C avec du C++



    Boost est un peu gros pour ce que je veux faire, mais je vais tous de même en discuter.
    Il n'existe pas de lib plus petit qui reprend la partie metaprog? Il me semble avoir vue ça sur le forum mais impossible de retrouver...

  14. #34
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Quelle partie metaprog? Parce que c'est un peu vaste...

    Ce que t'as du croisé c'est loki non?
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  15. #35
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Citation Envoyé par Goten Voir le message
    Quelle partie metaprog? Parce que c'est un peu vaste...
    Celle-la ?

  16. #36
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Goten Voir le message
    Quelle partie metaprog? Parce que c'est un peu vaste...
    Pour l'instant ce qui correspond à mes questions. Il me semble que ca reviens à ce qui est appeler programmation par concept.

    La je veux juste savoir si une classe à un membre nommé foo d'un type donné (fonction, int,...). Et ceux quel que soit l'héritage existant.

    Citation Envoyé par Goten Voir le message
    Ce que t'as du croisé c'est loki non?
    Je vais regarder merci.

  17. #37
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    A alors non. Toi tu parles de boost.concept_check. J'en connais pas d'autres. Mais sérieux à coup de SFINAE ça se fait vite fait ce que tu souhaites. (un peu de macro par dessus, quelques workaround, tu secoues, et roulez :p).

    @arzar : c'est bien ce que je disais.... c'est vaste :p (des DSEL aux traits, y'a quand même un fossé :p)
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  18. #38
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Goten Voir le message
    Mais sérieux à coup de SFINAE ça se fait vite fait ce que tu souhaites. (un peu de macro par dessus, quelques workaround, tu secoues, et roulez :p).
    ok..... mais je voie pas comment commencer

  19. #39
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Attends qu'on soit claire. Tu veux pouvoir écrire quelque chose comme :

    has_fct_foo<bar>::value;
    has_member_foo<bar>::value;
    has_type_foo<bar>::value; (et par type j'entends typedef, nested class)


    ou plus largement :
    has_foo<bar>::value
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  20. #40
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    je veut en gros cela
    Citation Envoyé par Goten Voir le message
    has_fct_foo<bar>::value;
    has_member_foo<bar>::value;
    et par exemple qu'avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct A {
        uneClass foo;
    };
     
    struct B : A {};
     
    struct C {
        uneClass foo;
    };
    has_member_foo<A>::value, has_member_foo<B>::value et has_member_foo<C>::value retournent vrai car j'ai un membre de type uneClass nommé foo. dans l'exemple que j'ai trouvé has_member_foo<B>::value retourne faux

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Spécialisation partielle d'une fonction template
    Par N0vember dans le forum Langage
    Réponses: 4
    Dernier message: 17/10/2010, 20h49
  2. Réponses: 8
    Dernier message: 18/06/2007, 15h06
  3. Réponses: 8
    Dernier message: 01/03/2007, 15h07
  4. [POO] Pointeur sur fonction membre et héritage
    Par MrDuChnok dans le forum C++
    Réponses: 9
    Dernier message: 20/07/2006, 17h19
  5. Réponses: 7
    Dernier message: 01/01/2006, 03h28

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