Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

for_each sur une typelist ?

14 réponses
Avatar
John Deuf
Bonjour,

J'aimerais utiliser une fonction de type for_each pour une typelist.
Quelqu'un d'entre vous l'a-t-il déjà écrite ou saurait où je peux la
trouver ? (Si elle est techniquement faisable, évidemment).

Actuellement j'écris :

#include <Typelist.h>
using namespace Loki;

class toto;
class titi;
typedef LOKI_TYPELIST_3(int, toto, titi) trucs;

template<int I>
class boucle {
private:
enum { go = (I-1) != 0 };

public:
static inline void travaille()
{
boucle<go ? (I-1) : 0>::travaille();

TL::TypeAt<trucs, I-1>::Result temp(40);
// fais des choses...
std::cout << temp << std::endl;
}
};

template <> class boucle<0> {
public:
static inline void travaille()
{ }
};

int main()
{
boucle< 3 >::travaille();
return 0;
}

Ce qui m'oblige à savoir la taille de la typelist et aussi de modifier
son nom dans la classe boucle.
J'aimerais écrire un truc du genre :
for_each::travaille( trucs );

Merci d'avance.

--
John Deuf

10 réponses

1 2
Avatar
Fabien LE LEZ
On 16 Jun 2009 13:57:03 GMT, John Deuf :

private:
enum { go = (I-1) != 0 };

public:
static inline void travaille()
{
boucle<go ? (I-1) : 0>::travaille();



Ton "go" me semble totalement inutile :

- si ((I-1) != 0), go==true, et (go ? (I-1) : 0) vaut I-1
- si ((I-1) == 0), go=úlse, et (go ? (I-1) : 0) vaut 0, soit I-1
aussi.
Avatar
Fabien LE LEZ
On 16 Jun 2009 13:57:03 GMT, John Deuf :

template<int I>
class boucle {



Je propose ça :

template <class Liste>
class Boucle
(
public:
static void travaille()
{
Liste::Head temp (40);
std::cout << temp << std::endl;

Boucle<Liste::Tail>::travaille(); /* Mettre au début de la
fonction pour inverser l'ordre de parcours de la liste. */
}
};


template <>
class Boucle <Loki::TL::NullType>
{
public:
static void travaille() {}
};



int main()
{
boucle<trucs>::travaille();
return 0;
}
Avatar
John Deuf
Fabien LE LEZ :

Ton "go" me semble totalement inutile :

- si ((I-1) != 0), go==true, et (go ? (I-1) : 0) vaut I-1
- si ((I-1) == 0), go=úlse, et (go ? (I-1) : 0) vaut 0, soit I-1
aussi.



En fait, le code vient de cette page :
http://awurl.com/SvpJqXPwZ#first_awesome_highlight

Et l'auteur dit que la fonction go() évite de répéter la condition s'il y
a plusieurs paramètres template.

--
John Deuf
Avatar
Mickaël Wolff
John Deuf wrote:

J'aimerais écrire un truc du genre :
for_each::travaille( trucs );



C'est quoi une typelist pour toi ? (désolé, mais la macro on peut pas
deviner ce qu'elle fait).


En fait, tu voudrais quelque chose dans ce gout là :

=== 8< == #include <algorithm>
#include <list>

struct visitor
{
static int counter ;
visitor() { }
void operator() (int ) { counter++ ; }
} ;

int visitor::counter = 0 ;

int main(int argc, char ** argv)
{
visitor alien ;
std::list<int> humans ;

humans.resize(10) ;
std::for_each(humans.begin(), humans.end(), alien) ;

return alien.counter ;
}
=== >8 ==
Au fait, est-ce que ma classe visitor correspond à une mise en place
du pattern visitor ?

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Avatar
John Deuf
Fabien LE LEZ :

Je propose ça :

template <class Liste>
class Boucle
(
public:
static void travaille()
{
Liste::Head temp (40);
std::cout << temp << std::endl;

Boucle<Liste::Tail>::travaille(); /* Mettre au début de la
fonction pour inverser l'ordre de parcours de la liste. */
}
};


template <>
class Boucle <Loki::TL::NullType>
{
public:
static void travaille() {}
};



int main()
{
boucle<trucs>::travaille();
return 0;
}



Ça marche nickel.
Merci beaucoup Fabien !!

--
John Deuf
Avatar
Michael Doubez
On 16 juin, 16:15, Fabien LE LEZ wrote:
On 16 Jun 2009 13:57:03 GMT, John Deuf :

>template<int I>
>class boucle {

Je propose ça :

template <class Liste>
class Boucle
(
  public:
   static void travaille()
     {
      Liste::Head temp (40);
      std::cout << temp << std::endl;

      Boucle<Liste::Tail>::travaille(); /* Mettre au début de la
fonction pour inverser l'ordre de parcours de la liste. */



Pour executer dans l'autre sens de parcours, il suffit d'inverser la
typelist.

     }

};

template <>
class Boucle <Loki::TL::NullType>
{
  public:
   static void travaille() {}

};

int main()
{
        boucle<trucs>::travaille();
        return 0;

}


Avatar
Fabien LE LEZ
On 16 Jun 2009 14:28:38 GMT, John Deuf :

En fait, le code vient de cette page :
http://awurl.com/SvpJqXPwZ#first_awesome_highlight



Donc, tu recopies du code sans le comprendre ? Méthode fortement
déconseillée, qui a fait des ravages en PHP (et contribue pour
beaucoup à la mauvaise réputation de ce langage).

Et l'auteur dit que la fonction go() évite de répéter la condition s'il y
a plusieurs paramètres template.



go n'est pas une fonction.
Avatar
Fabien LE LEZ
On 16 Jun 2009 13:57:03 GMT, John Deuf :

boucle< 3 >::travaille();



Note que tu peux écrire :

template <class Liste> void CallTravaille()
{
boucle< Loki::TL::Length<Liste> >::travaille();
}

ou bien :

void CallTravaille()
{
boucle< Loki::TL::Length<trucs> >::travaille();
}
Avatar
John Deuf
Fabien LE LEZ :

Donc, tu recopies du code sans le comprendre ? Méthode fortement
déconseillée, qui a fait des ravages en PHP (et contribue pour
beaucoup à la mauvaise réputation de ce langage).



Qu'est-ce qui te fais penser que je n'ai pas compris le code ?
Je l'ai assez compris pour pouvoir l'utiliser, comme pour la STL.

Et l'auteur dit que la fonction go() évite de répéter la condition
s'il y a plusieurs paramètres template.



go n'est pas une fonction.



Effectivement, c'est une valeur. Mais tu avais compris ce que je voulais
dire, n'est-ce pas ?

--
John Deuf
Avatar
John Deuf
Fabien LE LEZ :

void CallTravaille()
{
boucle< Loki::TL::Length<trucs> >::travaille();
}




Ça ne compilait pas avec mon VC++ quand j'avais essayé.

En outre, je crois qu'il faut plutôt écrire :
Loki::TL::Length<trucs>::value

--
John Deuf
1 2