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

Contribuez C++ Discussion :

[FAQ C++ ?] Passage d'un pointeur en parapètre template


Sujet :

Contribuez C++

  1. #21
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    F.A.Q. : J'ai pour surcharger mon opérateur la possibilité d'utiliser une fonction membre ou une fonction libre, que choisir ?

    Et puis si c'est pour avoir des classes avec que des fonctions statiques, alors autant avoir des namespace et des fonction libres, non ? Par exemple, à quelle classe rajouter des fonctions comme sqrt, sort, std::copy, etc... Ce sont des fonction sans 'état'. Donc le C++ permettant l'utilisation de fonction libre + namespace, alors autant utiliser cette possibilité.

  2. #22
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    F.A.Q. : J'ai pour surcharger mon opérateur la possibilité d'utiliser une fonction membre ou une fonction libre, que choisir ?

    Et puis si c'est pour avoir des classes avec que des fonctions statiques, alors autant avoir des namespace et des fonction libres, non ? Par exemple, à quelle classe rajouter des fonctions comme sqrt, sort, std::copy, etc... Ce sont des fonction sans 'état'. Donc le C++ permettant l'utilisation de fonction libre + namespace, alors autant utiliser cette possibilité.
    L'explication de la faq est plutot éloquente, je dois reconnaître que je n'avais pas envisagé les choses comme cela. Tant que j'y suis, existe t'il un moyen de recréer l'opérateur "->" ?

    merci.
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  3. #23
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Tu le surcharges comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    struct A
    {
        int i;
        const A* operator->() const { return this; }
        A* operator->() { return this; }
        // ou plutot : A* operator->() { return const_cast<A*>(static_cast<const A>(*this).operator->()); }
    };
     
    A a; A b; a->i = b->i;
    C'est un exemple, dans ce cas l'opérateur est assez inutile. Quand tu fais a->i ca fait : (a.operator->())->i .

  4. #24
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Merci beaucoup...

    Citation Envoyé par Flob90 Voir le message
    Quand tu fais a->i ca fait : (a.operator->())->i .
    ...Comment se fait il que le compilateur appele deux opérateurs "->" (pas les mêmes certes) ? C'est un comportement défini par la norme ?

    Citation Envoyé par Flob90 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        // ou plutot : A* operator->() { return const_cast<A*>(static_cast<const A>(*this).operator->()); }
    pourquoi faire un cast d'un (const ?)A en const A en A * ... surtout que je ne suis pas sûr qu'on puisse caster un A en A* comme ça :s
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  5. #25
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Oui définit par la norme (j'ai regardé avant de poster, j'ai jamais eu besoin de surcharger ->), j'ai pas la section en tête, regarde dans l'index.


    C'est une technique décrite par Meyers dans Effective C++. Ca permet de factoriser le code quand les version const et non-const d'une fonction font la même chose. Dans ce cas ca factorise pas grand chose c'est vraie.

    Le premier cast sert à rajouter const au type de *this, ce qui permet d'appeller la version constante, le second cast est sur le retour de la fonction et permet d'enlever le const qui est maintenant en trop.

  6. #26
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    C'est une technique décrite par Meyers dans Effective C++. Ca permet de factoriser le code quand les version const et non-const d'une fonction font la même chose. Dans ce cas ca factorise pas grand chose c'est vraie.
    Pour éviter la redondance des fonctions tout en gardant notre sucre syntaxique c'est ça ?

    Citation Envoyé par Flob90 Voir le message
    Le premier cast sert à rajouter const au type de *this, ce qui permet d'appeller la version constante, le second cast est sur le retour de la fonction et permet d'enlever le const qui est maintenant en trop.
    Je comprend par contre, dans ce cas, on devrait avoir un static_cast<const A*>() à la place du static_cast<const A>() non ?
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  7. #27
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Oui c'est ca, éviter une duplication du code et garder le même comportement.

    Non, this est de type T*, mais *this est de type T, donc c'est static_cast<cons T>(*this).func() ou static_cast<const T*>(this)->func()

  8. #28
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    Non, this est de type T*, mais *this est de type T, donc c'est static_cast<cons T>(*this).func() ou static_cast<const T*>(this)->func()
    Ha oui, désolé, j'avais mal regardé les parenthèses.
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  9. #29
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    j'ai jamais eu besoin de surcharger ->
    Les enveloppes surchargent cet opérateur, boost::shared_ptr par expl.

  10. #30
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Oui je m'en doute, mais j'ai jamais eu besoin de recoder ce genre de classes pour le moment.

Discussions similaires

  1. [Wincc flexible] Passage d'un pointeur a une fonction Vbs
    Par ren973 dans le forum Automation
    Réponses: 34
    Dernier message: 10/04/2008, 18h29
  2. Réponses: 31
    Dernier message: 31/03/2008, 14h58
  3. Réponses: 12
    Dernier message: 17/07/2007, 08h29
  4. Réponses: 7
    Dernier message: 02/12/2005, 13h02
  5. Réponses: 5
    Dernier message: 21/11/2005, 01h40

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