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 :

Où trouver une liste des opérateurs surchargeables en C++?


Sujet :

C++

  1. #1
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut Où trouver une liste des opérateurs surchargeables en C++?
    Bonjour,

    l'intitulé de la discussion se suffit à lui-même.
    Existe-t-il un document officiel?

    J'ai trouvé cette liste sur Wilkipedia.
    A première vue, ça a l'air sympa mais j'ai peur qu'il y ait des coquilles.
    Par exemple, l'opérateur = ne renvoie pas une référence (1ere ligne du tableau).
    Du coup, j'ai moyennement confiance...

  2. #2
    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
    C'est simple ils le sont tous à l'exception de ce trois :

    operator. , operator:: et operator.*
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  3. #3
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Merci pour ta réponse Goten.
    Il me semblait bien aussi.
    Mais, dans le document, il y en a plus.
    Par exemple, il est écrit que sizeof n'est pas surchargeable.
    Or, j'ai souvenir d'avoir lu le contraire (mais ma mémoire me fait peut être défaut).
    Bon, si je comprend bien, il est à jeter ce document...

    Sinon, j'ai remarqué que certains opérateurs ne sont surchargeables qu'à l'intérieur des classes.
    Pour la petite histoire, j'avais essayé de surcharger l'opérateur () pour faire un produit scalaire (u,v) en le déclarant comme fonction amie de ma classe vecteur.
    Où peut-on trouver ce genre d'information?

  4. #4
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    Citation Envoyé par Goten Voir le message
    C'est simple ils le sont tous à l'exception de ce trois :

    operator. , operator:: et operator.*
    et de ?:

  5. #5
    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 Aleph69 Voir le message
    l'intitulé de la discussion se suffit à lui-même.
    Existe-t-il un document officiel?
    Oui, le standard. Voir §13.5 Overloaded operators
    (Le standard ISO du C++98 est payant, mais on peut trouver ici le draft gratuit du standard C++0X -chercher "working draft"-. Je ne crois pas qu'il y ait eu de modification entre le C++98 et le C++0X sur la surcharge d'opérateur)

  6. #6
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Super, merci Arzar!

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Si tu veux surcharger les opérateurs pour faire un truc malin, je te conseille plutôt d'utiliser Boost.Proto.
    Au lieu de surcharger les opérateurs toi-même, Proto les surcharge tous pour toi et te fournit direct un AST que tu peux manipuler. Tu peux même définir une grammaire qui va automatiquement refuser les AST invalides et y attacher des transformations.

    Ça fait peur au premier abord, mais en fait c'est super simple et très très pratique.
    Boost ftw

  8. #8
    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
    @loufoque: Je n'ai jamais utilisé Proto, mais c'est pas un outils qui sert seulement dans des cas spécifique (analyseur syntaxique/parseur/...) ? Je ne vois pas comment une bibliothèque pourrait savoir comme définir des opérateurs sans contexte particulier. Exemple typique : l'opérateur d'affectation, si il n'est pas trivial, je ne vois pas comment une bibliothèque pourrait le deviner. Ou alors tu lui conseillais ceci pour réaliser son produite scalaire ?

    (l'opérateur "" n'est pas dans la liste du dernier draft, il est cependant expliqué plus bas dans le draft).

  9. #9
    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 Flob90 Voir le message
    @loufoque: Je n'ai jamais utilisé Proto, mais c'est pas un outils qui sert seulement dans des cas spécifique (analyseur syntaxique/parseur/...) ? Je ne vois pas comment une bibliothèque pourrait savoir comme définir des opérateurs sans contexte particulier. Exemple typique : l'opérateur d'affectation, si il n'est pas trivial, je ne vois pas comment une bibliothèque pourrait le deviner. Ou alors tu lui conseillais ceci pour réaliser son produite scalaire ?

    (l'opérateur "" n'est pas dans la liste du dernier draft, il est cependant expliqué plus bas dans le draft).

    Bien évidemment y'a un contexte par défaut mais tu peux aussi définir tes propres context d'évaluation. Le contexte par défaut attribut à chaque opérateur le sens que lui donne le standard.
    Par ailleurs y'a des choses plus puissantes que les context, comme les transform ( ~= action sémantique des parseurs).
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  10. #10
    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
    Je savais bien que j'aurais pas du utiliser le mot "contexte". Je ne parle pas du contexte au sens du contexte d'évalutation. plutot dans le sens général.

    Par exemple, je fais ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class A { type_non_copiable t; };
    Je vois mal un compilateur deviner un opérateur d'affectation pour ma classe, le contexte c'est juste que je développe une classe nommé A.

    Le seul sens de ma question était d'être bien certain que Proto servait à résoudre un problème spécifique, et pas à déclarer les différents opérateurs à la place du programmeur dans toute situation (=contexte) ?

    Et à part la petite phrase d l'OP concernant le produit scalaire, il ne précise pas pourquoi il a besoin de cette liste, du coup l'utilisation de Proto n'est paut-etre pas du tout adapté à son cas.

  11. #11
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Je n'ai jamais utilisé Proto, mais c'est pas un outils qui sert seulement dans des cas spécifique (analyseur syntaxique/parseur/...) ?
    Ça peut servir pour des cas très simples aussi.
    Voir l'exemple de Boost.Assign dans la vidéo de Boostcon 2010.
    http://tinyurl.com/2wvezjq

    Je ne vois pas comment une bibliothèque pourrait savoir comme définir des opérateurs sans contexte particulier.
    Ça créé juste un type qui représente l'expression, à toi après d'y donner du sens quand tu le transformes.
    Boost ftw

  12. #12
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Bonjour,

    j'ai deux questions à propos de boost.proto.
    Est-ce que cela me permettrait de pouvoir écrire ce genre de chose?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Vecteur u(10) // construction d'un vecteur de longueur 10 (double)
    Vecteur v(10) // construction d'un vecteur de longueur 10 (double)
    // ... initialisation de u et v
    double produit_scalaire = (u,v); // calcul d'un produit scalaire entre u et v
    Et, si oui, est-ce que ça serait aussi rapide qu'une implémentation plus classique du produit scalaire avec une fonction amie de Vecteur?

  13. #13
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    oui et oui, mais j'avoue que la notation ets malsaine.

    Proto sert à faire trés rapidement des EDSL très efficace au runtime en t'abstrayant de ts les details infames que necessites les expressions templates fait main.

  14. #14
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Effectivement, ça a l'air intéressant.
    Je vais me pencher sur la question.

    Sinon, pourquoi trouves-tu la notation malsaine?

  15. #15
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    Citation Envoyé par Aleph69 Voir le message
    Effectivement, ça a l'air intéressant.
    Je vais me pencher sur la question.

    Sinon, pourquoi trouves-tu la notation malsaine?
    operator, a ces petites subtilités, et tu va avoir des problèmes des que va devoir gérer

    double d = (u,v,w);

    dot(u,v) est tres bien, et tu peut lui faire renvoyer un noeud lazy comme ,.

  16. #16
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    ca me fait penser qu'il va falloir que je ponde un article sur proto un de ces 4.

  17. #17
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Tout d'abord, merci pour le lien vers ton papier, je ne l'avais pas vu.

    Pour le dot(u,v), c'est le choix que j'ai fait pour l'instant.
    Ca me paraît clair et c'est assez parlant pour ceux qui ont touché au dot_product du fortran.

    Pour la notation (u,v,w), j'imagine que ça fait référence au produit vectoriel.
    Ca va poser quel genre de problème?

    Et sinon, c'est quoi un noeud lazy?

  18. #18
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    Citation Envoyé par Aleph69 Voir le message
    Tout d'abord, merci pour le lien vers ton papier, je ne l'avais pas vu.
    J'en ai plein d'autre comme ça :€

    Citation Envoyé par Aleph69 Voir le message
    Pour la notation (u,v,w), j'imagine que ça fait référence au produit vectoriel.
    Ca va poser quel genre de problème?
    u,v,w ca va etre u,(v,w)

    va donc falloir dire que vector,expr<comma> c'ets un produit vectoriel.
    C'est chelou

  19. #19
    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
    Et sinon, c'est quoi un noeud lazy?
    Qui sera évalué au plus tard. (quand tu l'utiliseras).

    ca me fait penser qu'il va falloir que je ponde un article sur proto un de ces 4.

    Oui :€.

    Sinon en attendant y'a les articles d'Eric Niebler sur cppnext
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] [débutante VBA] trouver la liste des images utilisée dans une feuille
    Par EmmanuelleC dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 09/10/2009, 13h46
  2. Trouver la liste des controls d'une page
    Par zooffy dans le forum ASP.NET
    Réponses: 2
    Dernier message: 06/08/2007, 11h47
  3. obtenir une liste des noms de session d'un ordinateur
    Par Raylemon dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 09/03/2006, 19h12
  4. [IDE][VS.NET 2003] Y a-t-il une liste des racourcis ?
    Par 404Found dans le forum Contribuez
    Réponses: 2
    Dernier message: 22/06/2004, 20h20
  5. Où trouver la liste des caractères spéciaux?
    Par gamez dans le forum Langage
    Réponses: 3
    Dernier message: 19/08/2003, 17h54

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