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 :

Boucle for en méta-programmation?


Sujet :

Langage C++

  1. #1
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut Boucle for en méta-programmation?
    Salut
    Est-ce que quelqu'un voit comment faire une boucle "for" en meta-programmation sur un intervalle constant?
    Il faudrait que cette boucle se déroule complètement pour le compilo et que l'on ait accès au numéro d'itération dans la boucle.

    Pour l'exemple du factoriel de 10, quelque chose qui ressemblerait plus ou moins à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fact*=1
    meta_for<1,10>
    {
      fact*=I;
    }
    Ou peut-être bien avec un foncteur, du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct fact
    {
      int x;
      fact() :x(1) {};
      void operator() (int i) { x=i*x;}
    };
     
    meta_for<1,10>(fact())

  2. #2
    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
    La méta-programmation c'est du fonctionnel pur.
    Faire une boucle for ça n'a pas de sens.

    Après, tu peux faire un fold/accumulate...

    Le deuxième truc c'est juste une boucle déroulée, pas de la méta-programmation.

  3. #3
    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
    C'est comme en prolog.
    Tu pars d'un bout jusqu'à ce que tu puisses unifier (voca?) avec l'autre bout.

    Tu définis donc ta règle générale de N en fonction de N-1, et la règle finale pour 1.

    PS: l'exemple de la factorielle doit être le plus répandu dans la littérature relative à la méta-prog.
    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...

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    C'est peut-être pas de la "meta-programmation", quoi qu'il en soit est-il possible de dérouler une boucle avec une programmation de ce genre. et comment?

    L'exemple de la factorielle est peut-être mal choisi.
    Ce que je veux c'est bien un moyen de dérouler une boucle "for", pour en accélérer le calcul.
    C'est pour mettre dans une fonction qui recoit un paramètre constant par template.

  5. #5
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    -funroll-loops ? (de mémoire, sous gcc).

    Certes, ce n'est pas de la meta-programmation, mais si tu en es à ce niveau d'optimisation, commence peut-être par jouer avec les paramètres du compilo, non ?

  6. #6
    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
    Je te renvoie aux fondamentaux: http://www.oonumerics.org/blitz/papers/
    Tu trouveras des liens vers les articles de Todd Veldhuizen. Dans mes souvenirs il y avait des explications sur comment dérouler les boucles.
    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...

  7. #7
    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
    Il y aussi ça (Merci Laurent Gomila) :
    http://loulou.developpez.com/tutoriels/cpp/metaprog/

  8. #8
    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
    Ah et au passage, la lecture de C++ Template Metaprogramming ne peut être que bénéfique pour toi.
    C'est l'ouvrage de référence, avec C++ Templates : The Complete Guide (de Verdhuizen entre autres justement), pour tout ce qui se rapproche à la métaprogr en C++.

  9. #9
    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
    Dérouler une boucle c'est un peu trivial...

    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<size_t I, size_t M, size_t INC = 1, typename Enable = void>
    struct for_unrolled
    {
    	template<typename F>
    	static inline void apply(const F& f)
    	{
    		f(I);
    		for_unrolled<I+INC, M, INC>::apply(f);
    	}
    };
     
    template<size_t I, size_t M, size_t INC>
    struct for_unrolled<I, M, INC, typename boost::enable_if_c<I >= M>::type>
    {
    	template<typename F>
    	static inline void apply(const F& f)
    	{
    	}
    };

  10. #10
    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
    J'avais proposée une solution de ce genre il y a quelques temps sur une autre question : cf ici (dans tous le fouillis, c'est dec2oct2dc) .
    Ca revient (en un peu plus brouillon) à ce que te proposes loufoque : un générique pour le parcours et une spécialisation partielle pour l'arrêt.

  11. #11
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Merci à tous, ça répond à ma question

Discussions similaires

  1. Programme avec une boucle for
    Par twice dans le forum MATLAB
    Réponses: 6
    Dernier message: 11/07/2011, 08h01
  2. [Débutant] Faire appel à un programme plusieurs fois dans une boucle for
    Par hibouchka dans le forum MATLAB
    Réponses: 9
    Dernier message: 01/03/2011, 17h09
  3. Boucle For : je sais plus programmer !
    Par qi130 dans le forum Langage
    Réponses: 3
    Dernier message: 21/07/2004, 22h11
  4. [Swing][boucles] for, do, if .....comment faire simple?
    Par chastel dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 02/05/2004, 22h49
  5. [langage] boucle "for" modification du pas
    Par K-ZimiR dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2004, 11h54

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