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 :

stdarg et c++


Sujet :

C++

  1. #1
    Membre chevronné 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
    Par défaut stdarg et c++
    Bonjour,
    simple curiosité, mais y a-t-il des raison autres que la chance qui fait que je n'ai jamais vu de code avec une fonction virtuelle exploitant stdarg ? du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class It {
    public:
      void function(int n,...) {
         va_list arg;
         va_start(arg,n);
         vFunction(arg);
         va_end(arg);
      }
     
    private:
      virtual vFunction(va_list param) = 0;
    };
    Merci pour tout réponse >< !

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Il n'y a rien qui t'empêche de faire cela. Mais en C++ c'est quand même ultra limité : tu ne peux pas utiliser le passage par référence (et c'est encore plus gênant quand on souhaite passer un objet (instance d'une classe)) dans la liste variable.

  3. #3
    Membre chevronné 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
    Par défaut
    Je vais donc considéré que c'est le hasard...

    Citation Envoyé par Melem Voir le message
    tu ne peux pas utiliser le passage par référence (et c'est encore plus gênant quand on souhaite passer un objet (instance d'une classe)) dans la liste variable.
    Oui, enfin, y a quand même les pointeurs >< !

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut
    Citation Envoyé par Lavock Voir le message
    Oui, enfin, y a quand même les pointeurs >< !
    Sauf que le passage d'argument par pointeurs, c'est moyen moyen s'il est possible de s'en passer, et surtout si cela implique l'utilisation de l'opérateur "address of"
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Parce qu'on peut passer que des POD?

  6. #6
    Membre chevronné 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
    Par défaut
    Non, mais pas de ref... donc lourd pour certain objet.
    Du coup je trouve les pointeurs justifié dans se cas >< !

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

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Citation Envoyé par Lavock Voir le message
    Non, mais pas de ref... donc lourd pour certain objet.
    Du coup je trouve les pointeurs justifié dans se cas >< !
    C'était pas une question mais une affirmation : Tu peux pas passer de type non POD à l'opérateur elipse hein... (je sais pas si le non était pour ça).

    (là où je voulais en venir c'est que du coup l'intérêt en C++ est limité et qu'on voit pas souvent cet opérateur... mais il va revenir au gout du jour )

    edit : pour être plus précis ça compile mais ça plantera au runtime.

  8. #8
    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
    Par défaut
    Salut,
    Disons que les fonctions à arguments variables ont très peu d'intérêt. S'ils s'agit d'objets de même type, alors autant passer un conteneur ou un couple d'itérateur begin/end. S'il s'agit d'objets de types hétérogènes, probablement on passera par un Boost.Variant ou un Boost.Any (selon la variabilité) dans un conteneur (vecteur,liste, etc.).
    Notes qu'en C++0x cela deviendra encore moins probable avec les variadics template.

  9. #9
    Membre chevronné 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
    Par défaut
    Erf, c'est étrange, je savais qu'on ne pouvais passer ni fonction, ni ref, ni tableau, mais pourquoi que des PODs ? Par POD, tu veux dire type fondamental ou vraiment POD ? Je veux dire, selon la définition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct S {
     char c;
     int i;
    };
    c'est un POD. Mais, ça marchera ou pas ? ><

    En fait, je vais tester moi même... Mais je suis curieux de savoir pourquoi ça ne marche pas >< !

  10. #10
    Membre chevronné 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
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Notes qu'en C++0x cela deviendra encore moins probable avec les variadics template.
    En faite, leur gros incovénient, c'est que se sont des templates >< ! Donc si je sais pas comment la fonction va être appelé à la compilation, je ne peux pas les utilisé.
    J'avais penser à une sorte de boost.any. En fait, je me contente de faire une interface "vide" avec juste un destructeur virtuel pur, pour chainer avec du dynamic_cast et renvoyer une erreur en cas de pépain). En gros, j'ai juste aucune vérification...
    Mais bon, c'était pas vraiment important... Juste pour voir comme ça !

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

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Citation Envoyé par Lavock Voir le message
    Erf, c'est étrange, je savais qu'on ne pouvais passer ni fonction, ni ref, ni tableau, mais pourquoi que des PODs ? Par POD, tu veux dire type fondamental ou vraiment POD ? Je veux dire, selon la définition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct S {
     char c;
     int i;
    };
    c'est un POD. Mais, ça marchera ou pas ? ><

    En fait, je vais tester moi même... Mais je suis curieux de savoir pourquoi ça ne marche pas >< !
    S est un pod, donc oui ça passera. De toute façon ton compilo si il est bien réglé te sort un warning. Et par pod j'entends POD au sens de la norme C++.
    Si le compilo te dit rien a l'appel au runtime tu as : Instruction non permise. (truc dans ce gout là).

    (le pourquoi du ça marche pas, je l'ai eu su, mais j'ai eu vite fait de l'oublier, une petite recherche bien placée te répondra mieux que moi :p. _me semble que loufoque en avait parler sur le fofo).

  12. #12
    Membre chevronné 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
    Par défaut
    Effectivement, j'ai trouver le topic. Thanks !

  13. #13
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    Et accessoirement, le dernier argument juste avant l'ellipse doit être POD également.
    Donc pas de std::string par exemple ...
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

Discussions similaires

  1. ellipse : Passage d'arguments multiples (stdarg)
    Par domiq44 dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 04/02/2010, 15h06
  2. printf sans stdarg.h
    Par lwhite dans le forum Débuter
    Réponses: 4
    Dernier message: 06/11/2008, 18h14
  3. SDL : stdarg et stddef -> No such file or directory
    Par gollunk dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 17/03/2008, 14h25
  4. Réponses: 5
    Dernier message: 18/10/2006, 20h30
  5. stdarg Heritage
    Par GroRelou dans le forum C++
    Réponses: 3
    Dernier message: 27/02/2006, 22h31

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