Bonjour !
Ce que je trouve le plus difficile quand on apprend un langage, ce n'est pas n�cessairement la syntaxe ou les probl�mes dans lesquels tout le monde tombe, mais plut�t d'acqu�rir les pratiques et habitudes de ceux qui ont de l'exp�rience dans le langage en question. Mon cas aujourd'hui concerne justement une de ces "habitudes" qu'un d�veloppeur C++ exp�riment� a probablement.
Supposons que j'�crive une fonction cens�e retourner une liste de fichiers (par exemple les photos pr�sentes sur un p�riph�riques). Pour moi, programmeur c++ inexp�riment�, un prototype naturel serait celui-ci :
D�j� j'ai choisi un vecteur de strings plut�t qu'un std::list parce que cette liste ne sera g�n�ralement pas modifi�e par l'appelant. C'est peut-�tre pas le bon choix ?
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2 void GetPhotoList (const std::string& device_name, std::vector<std::string>& picture_list);
Ensuite, ce que je n'aime pas dans ce prototype c'est que l'appelant n'a pas la moindre id�e de ce que le pr�c�dent contenu de mon vecteur va devenir. La fonction va t elle ajouter la liste � la fin ou va t-elle remplacer le contenu existant ?
Alors je me suis dit que je pourrais simplement fournir un template qui prend un iterateur "destination" et laisser l'appelant se d�brouiller avec �a. Mon prototype deviendrait donc grosso modo :
J'aime bien, mais voil� ce que j'y reproche :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5 template<typename It> void GetPhotoList (const std::string& device_name, It dest); // Code appelant : GetPhotoList ("phone", std::back_inserter(mon_conteneur));
1) L'impl�mentation de mon GetPhotoList() va se retrouver dans un header, ce qui me pose quelques probl�mes pour encapsuler son fonctionnement (il varie d'une plateforme � l'autre).
2) J'ai pas l'impression de voir �a "souvent" : la majeure partie du code C++ que je rencontre dans ma vie de tous les jours correspond plut�t � mon premier exemple (dois-je trouver des coll�gues plus exp�riment�s ?).
3) Dans 99% des cas, je vais utiliser cette fonction avec un vecteur. Pourquoi pas simplifier ce cas g�n�ral et laisser l'appelant se d�brouiller � convertir ensuite vers un autre conteneur pour les 1% restants ?
Voil� o� j'en suis, j'aimerais beaucoup des opinions et recommendations pour me faire une id�e, non seulement pour ce cas, mais pour mes d�veloppements futurs. Merci beaucoup.
Partager