Bonjour,
Merci à ceux qui lirons ce post, et encore plus à ceux qui pourront y répondre.
Je débute en spirit, je dois en être à mon troisième parseur, et je dois que je n'aime pas beaucoup les habitudes que j'ai prise. Il y a sans doute une ou plusieurs erreurs dans ma façon de faire.
Voici un cas concret. Je veux parser le texte suivant :
Et mettre les valeurs dans un conteneur de structures, quelque chose comme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 "{14,12} {18,4} {27,2}"
Pour le moment, j'utilise les foncteur suivants :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 struct A { int x,y; }; typedef std::list<A*> Contenair Contenair maListe;
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 struct ReaderX { int x&; ReaderX(int& newX) :x(newX) { }; void operator()(int val) { x = val; }; };
du coup, mon parsage ressemble à ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 struct ReaderY { int x&; Contenair cont; ReaderX(int& newX, Contenair & newContenair) : x(newX), cont(newContenair) { }; void operator()(int val) { newContenair.push_back(new A(x,val)); }; };
On voit bien la philosophie de ce code : j'utilise un premier Actor qui se contente de mettre à jour une variable locale à l'aide d'une référence, puis j'utilise un second Actor qui crée mon objet en utilisant cette référence.
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 Contenair maListe; int variable_locale; ReaderX(variable_locale) ReaderY(variable_locale, maListe) Rule_t rule = *( ch_p{'{'} >> int_p[ReaderX] >> ch_p{','} >> int_p[ReaderY] >> ch_p{'}'}; ); parse(...,rule);
On voit aussi bien que c'est absurde. Il me semble qu'il ne devrait y avoir qu'un unique Actor :
- la propriété de la variable ne devrait pas appartenir au code appelant. En particulier, il n'y a pas de raison que quelqu'un d'autre que le foncteur ait accés à cette variable.
- Si mes objets contenaient non-pas 2, mais 40 valeurs, il y aurait 40 variables locales "polluantes".
Je suppose qu'une meilleure attitude serait quelque chose comme :
ou 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 Contenair maListe; Reader(maListe) Rule_t rule = *( ch_p{'{'} >> int_p[Utilise_Fonction<Reader,setX>] >> ch_p{','} >> int_p[Utilise_Fonction<Reader,setY>] >> ch_p{'}'}; ); parse(...,rule);
Merci à ceux qui pourront m'aider, ou simplement donner leur avis.
Partager