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 :

[Metaprogramation]Boucle for template (très) générique


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut [Metaprogramation]Boucle for template (très) générique
    Bonjour.

    J'essaye (pour le fun ) de programmer une boucle for template (très) générique qui prendrait en paramètre un foncteur nullaire mais avec un paramètre template et le fairait itérer sur un certains champ.

    L'implémentation que j'ai essayé de faire donne ça:
    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
      template < class template<size_t>Operation,size_t End,int Step=1,size_t Start=0>
      struct ForLoop
      {
        inline void operator()()
        {
          Operation<Start>();
          ForLoop<Operation,Start+Step,Step>();
        }
      };
      template <class template<size_t>Operation, size_t End,int Step>
      struct ForLoop<Operation,End,Step,End>
      {
        inline void operator()()
        {}
      };
    l'idée étant d'appeler la fonction comme suit:
    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
    20
     
    //peut-être rajouter une couche template pour Maclasse, et le vector, mais bon :p
      template <Maclasse Value, std::vector<Maclasse> Var>
      struct SetToVal //un exemple de foncteur
      {
        template <size_t Index>
        struct at
        {
          inline void operator()() const
          {
            Var.at(Index) = Value;
          }
        };
      };
     
    int main()
    {
      std::vector<MaClasse> B(50);
      ForLoop< SetToVal< Maclasse(), B>::at, 50>();
    }
    Le problème étant, bien entendu, que cela ne compile pas, notamment par-ce que dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     template < class template<size_t>Operation,size_t End,int Step=1,size_t Start=0>
    ,une syntaxe du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class template<size_t>Operation
    ne marche pas car il ne prend pas en compte size_t et attend une classe et non une constante...

    Du coup, je suis bien eu

    Évidemment, je pourrais utiliser des foncteurs inlines unaire à la place, mais pourquoi faire simple quand on peut faire compliqué hein ?

    De plus, j'aimerais (encore plus alors que ça ne marche pas) généraliser et avoir un type évalué template (à la place du size_t) et un step qui serait un opérateur évalué en compile time (je délire je crois).

    donc la question est : est-ce possible (et si oui jusqu'a quel point, je ne crois pas au coup du step). et surtout comment ?

    Bon, je vous laisse à mes délire de codeur du soir.

    Merci

  2. #2
    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
    Quelque chose comme ça :

    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
    20
    21
    22
     
    template <size_t I, size_t M, size_t INC = 1>
    struct for_
    {
        template <typename F>
    	static void apply(const F& f)
    	{
    	    f();	    
    	    for_<I+INC, M, INC>::apply(f);
    	}   
     
    };
     
    template <size_t M, size_t INC>
    struct for_<M,M,INC>
    {
        template <typename F>
    	static void apply(const F& f)
    	{
    	   f();
    	}
    };
    ?

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par Goten Voir le message
    Quelque chose comme ça :

    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
    20
    21
    22
     
    template <size_t I, size_t M, size_t INC = 1>
    struct for_
    {
        template <typename F>
    	static void apply(const F& f)
    	{
    	    f();	    
    	    for_<I+INC, M, INC>::apply(f);
    	}   
     
    };
     
    template <size_t M, size_t INC>
    struct for_<M,M,INC>
    {
        template <typename F>
    	static void apply(const F& f)
    	{
    	   f();
    	}
    };
    ?
    non, car là, on ne peut passer d'index à f... et j'aimerais le lui passer en template (pas en paramètre "normal")

  4. #4
    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
    Tu peux pas faire ce que tu veux (et je vois pas pourquoi tu le passerais pas en paramètre de fonction...).

    Mais j'avoue que c'est un poil confus ce que tu veux donc j'ai peut être mal saisi.

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par Goten Voir le message
    (et je vois pas pourquoi tu le passerais pas en paramètre de fonction...).
    L'idée est de pouvoir l'utiliser comme ce que c'est c'est à dire un paramètre template et non un argument. par exemple, supposons que je veuille assigner à chaque membre d'un tableau la valeur de la factorielle correspondant à l'index:

    il me suffirait alors d'écrire:
    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
    20
    21
    22
    23
    template<class Type,unsigned int Val>
    struct Factorielle
    {
      const static Type Value=Factorielle<Type, Val-1>;
    }
    template<class Type>
    struct Factorielle<Type, 0>
    {
      const static Type =1;
    }
     
    template < std::vector<MaClasse> Var>
    struct SetToFact //un exemple de foncteur
    {
      template <size_t Index>
      struct at
      {
        inline void operator()() const
        {
          Var.at(Index) = Factorielle<MaClasse,Index>::Value;
        }
      };
    };
    et initialiser mon tableau avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main()
    {
      std::vector<MaClasse> B(50);
      ForLoop< SetToFact< Maclasse(), B>::at, 50>();
    }
    Alors qu'obtenir ce genre de comportement est impossible à l'aide d'un foncteur puisque dés lors qu'il est passé en paramètre, l'index n'est plus template :s

    Citation Envoyé par Goten Voir le message
    Mais j'avoue que c'est un poil confus ce que tu veux donc j'ai peut être mal saisi.
    Désolé, ce n'est pas tres simple non plus je fais du mieux que je peux.

  6. #6
    Membre Expert

    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 : 35
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Quelque chose comme ca :
    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
    20
    21
    22
    23
    24
    25
     
    template
    <
    	template<size_t> class Operation,
    	size_t End,
    	int Step=1,
    	size_t Start=0
    >
    struct ForLoop
    {
    	inline void operator()()
    	{
    		Operation<Start>();
    		ForLoop<Operation,End,Step,Start+Step>();
    	}
    };
     
    template
    <
    	template<size_t> class Operation,
    	size_t End,
    	int Step
    >
    struct ForLoop<Operation,End,Step,End>
    { inline void operator()() {}; };
    J'ai pas testé si ca marchais, mais en tout cas ca compile.

    template<size_t> class Operation est la syntaxe pour les template template parameter, c'est à dire les paramètre template qui sont des class template. Inutile de nommer les (second) paramètres templates, ils sont inutiles. Dans ton cas c'est size_t mais ca pourrait être template<class> class Operation slon le cas. (cf faq template comeau pour des détail, et MC++D pour une utilisation).

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

Discussions similaires

  1. [XSLT 1.0] Boucle for each ou template méthode
    Par kacedda dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 27/08/2014, 16h17
  2. temps d'exécution très lent pour les boucles for
    Par NELLLY dans le forum MATLAB
    Réponses: 2
    Dernier message: 02/01/2013, 11h00
  3. rendre plus générique une boucle for
    Par beegees dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 31/05/2009, 22h31
  4. [Template] Template et boucle for
    Par Bakura dans le forum Langage
    Réponses: 4
    Dernier message: 27/10/2008, 14h11
  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