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 :
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
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
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;
}
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
// 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);
}
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
wxString s;
s << "coucou " << join(vec.begin(), vec.end(), " - ") << " hop";
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
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(), " - ");
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.
Me méprends-je ?
Y a t il un solution ?
--
Jérémie