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

Boost C++ Discussion :

Q_foreach et ou Boost_foreach


Sujet :

Boost C++

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut Q_foreach et ou Boost_foreach
    quelle macro il faut utiliser ? Q_FOREACH ou BOOST_FOREACH ?
    quelles differences ? la plus efficace ? la plus compatible ? vos conseils ?

    merci

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    d'apres mes tests:

    sur un vector STL
    BOOST_FOREACH ne copie pas la collection,
    Q_FOREACH copie la collection

    -1 pour Q_FOREACH ?

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    et pourquoi le foreach de Qt copie la collection ?
    y-a-t-il un interet que je ne vois pas ?

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    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 296
    Par défaut
    Pas persuadé qu'il y ait une véritable copie. QT a tendance à user et abuser du COW.
    Du coup, je soupçonne que ce doit être un moyen de poser un pseudo lock sur la variable manipulée, ce qui permettra de la bidouiller sans réfléchir depuis un autre thread.
    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...

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    Citation Envoyé par Luc Hermitte
    Pas persuadé qu'il y ait une véritable copie. QT a tendance à user et abuser du COW.
    Du coup, je soupçonne que ce doit être un moyen de poser un pseudo lock sur la variable manipulée, ce qui permettra de la bidouiller sans réfléchir depuis un autre thread.
    c'est ce que je pensais aussi, mais je ne pense pas que ce soit si interessant que ca ... j'aime vraiment bien BOOST_FOREACH

  6. #6
    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
    Par défaut
    Boost.Foreach est conçu pour itérer des conteneurs ou itérateurs de type STL.
    Q_FOREACH c'est fait pour fonctionner avec les conteneurs de Qt.

    Ce sont donc des choses différentes.

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    Citation Envoyé par loufoque
    Boost.Foreach est conçu pour itérer des conteneurs ou itérateurs de type STL.
    Q_FOREACH c'est fait pour fonctionner avec les conteneurs de Qt.
    Ce sont donc des choses différentes.
    pas tant que ca,
    Q_FOREACH fonctionne aussi avec des conteneurs STL,
    et BOOST_FOREACH fonctionne aussi avec des conteneurs Qt.

  8. #8
    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
    Perso, je n'ai envie d'utiliser aucune des deux. J'attends pour ce genre de chose une vraie solution dans le langage. Ne serait-ce que pour le problème de virgule que les deux solutions ont.

    Mais effectivement, bien que la copie préalable de Q_FOREACH ne soit pas très gênante pour les conteneurs Qt, pour les autre conteneurs, elle me semble rédhibitoire. De même, le fait de ne pas pouvoir modifier les valeurs itérées me semble un inconvénient du Q_FOREACH.
    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.

  9. #9
    Alp
    Alp est déconnecté
    Expert confirmé

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    C'est vrai qu'une solution dans le langage serait préférable, mais en attendant, je préfère utiliser BOOST_FOREACH, pour les raisons ci-dessus.

  10. #10
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Y'avait une proposition de Stroustrup pour le support des fonctions lambdas en natif, et ça permettrait de résoudre le problème de manière élégante aussi.

    Dans une certaine mesure, boost::lambda suffit aussi, mais montre ses faiblesses dès qu'on utilise des structures.

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    Citation Envoyé par JolyLoic
    Perso, je n'ai envie d'utiliser aucune des deux. J'attends pour ce genre de chose une vraie solution dans le langage. Ne serait-ce que pour le problème de virgule que les deux solutions ont.
    Quel probleme de virgule ?

  12. #12
    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
    La virgule sert de séparateur de macro, et le langage de macro ne sait pas que < et > servent de "parenthèses" pour des templates. Conclusion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MA_MACRO(std::pair<string, string> p, monConteneur);
    Le préprocesseur prend ça comme une macro à 3 arguments :
    - std::pair<string
    - string> p
    - monConteneur
    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.

  13. #13
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    Citation Envoyé par JolyLoic
    La virgule sert de séparateur de macro, et le langage de macro ne sait pas que < et > servent de "parenthèses" pour des templates. Conclusion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MA_MACRO(std::pair<string, string> p, monConteneur);
    Le préprocesseur prend ça comme une macro à 3 arguments :
    - std::pair<string
    - string> p
    - monConteneur
    si tu fais un typedef ca marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef std::pair<string, string> pair_string_string;
    BOOST_FOREACH(pair_string_string p, monConteneur)
    et ca marche !!!
    pourquoi s'en priver et attendre 5 ans le temps que tous les compilateurs se mettent a niveau ?

  14. #14
    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
    Oui, un typedef corrige le problème. Ca reste quand même non intuitif, plus lourd à écrire. Et je parie qu'en cas d'oubli, le message d'erreur n'est pas immédiatement compréhensible.

    En fait, la vrai critère est que je ne ressent pas l'absence d'un for_each vraiment comme une privation. Clairement pas assez en tout cas pour réfléchir si je veux utiliser les macros existantes (et donc en forcer l'utilisation à mes collègues).


    Ce qui me semble bien plus essentiel pour écrire des boucles aisément, c'est auto. Lui, si je pouvais en avoir une version bricolée qui marche à peu près, je me poserais sérieusement la question.
    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. BOOST_FOREACH bug ?
    Par poukill dans le forum Boost
    Réponses: 4
    Dernier message: 05/11/2010, 08h51
  2. [BOOST_FOREACH] ne marche pas
    Par arthurembo dans le forum Boost
    Réponses: 13
    Dernier message: 09/02/2009, 18h39
  3. Exit from Boost_foreach
    Par dhoorens dans le forum Boost
    Réponses: 3
    Dernier message: 02/07/2008, 21h00

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