Bonjour
Je souhaite reproduire (en gros) le fonctionnement de python join, c'est a dire de joindre par un separateur les éléments d'un conteneur.
ex :
Pour faire quelquechose de générique, j'ai donc fait :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 std::vector<int> vec; vec.push_back(1); vec.push_back(2); vec.push_back(3); join(std::cout, vec.begin(), vec.end(), " - "); // Affiche : 1 - 2 - 3
Un fois cela fait, je me suis dit qu'il serai intéressant de surcharger cette fonction de plusieurs manieres :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 template <class Stream, class Iterator, class Sep> Stream& join(Stream& s, Iterator it, Iterator last, const Sep& sep) { for (--last; it != last; ++it) { s << *it << sep; } s << *it; return s; }
Jusque là, tout va bien. Mais je souhaitais aller un peu plus loin, surtout dû au fait que j'utilise wxWidgets, et que la classe wxString accepte les operateurs de flux. J'aurais donc bien voulu faire un truc du genre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 // Pour un conteneur complet plutot qu'un range d'iterator template <class Stream, class Container, class Sep> Stream& join(Stream& s, const Container& c, const Sep& sep) { return join(s, c.begin(), c.end(), sep); }
Je ne souhaite plus fournir le flux à la méthode. Ca n'est pas dérangeant en soit, mais le problème vient plutôt de la déclaration et de l'instanciation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 wxString s; s << "coucou " << join(vec.begin(), vec.end(), " - ") << " hop";
Le compilateur est évidement un peu perdu : j'ai 2 fonctions join prenant 3 paramètres. On aurai pu penser que le fait que les 2 premiers arguments nécessitant d'être identique aurai permis au compilateur de prendre la bonne fonction, mais cela n'a pas l'air d'être le cas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 template<class Stream, class Iterator, class Sep> Stream join(Iterator it, Iterator last, const Sep& sep) { Stream s; return join(s, it, last, sep); } // Comment l'appeller ? join<wxString>(vec.begin(), vec.end(), " - ");
Me méprends-je ?
Y a t il un solution ?
--
Jérémie
Partager