Étant donné ce code, est-il possible de changer dumpSsortingngs()
pour pouvoir itérer sur n’importe quel conteneur de ssortingng
, comme par exemple une list
?
#include #include #include #include using namespace std; void dumpSsortingngs(vector::iterator it, vector::iterator end) { while (it != end) { cout << *it++ << endl; } } int main() { vector strVector; strVector.push_back("Hello"); strVector.push_back("World"); dumpSsortingngs(strVector.begin(), strVector.end()); return 0; }
Oui
http://www.boost.org/doc/libs/1_45_0/libs/utility/enable_if.html
http://www.cplusplus.com/reference/std/iterator/iterator_traits/
template typename enable_if< is_same::value_type, ssortingng> >::type function(...
Créer un modèle
template void dumpSsortingngs(iterator_type it, iterator_type end) { while (it != end) { cout << *(it++) << endl; } }
Le modèle supprime également la limite du type de valeur de conteneur en chaîne. Notez que vous avez besoin des parenthèses autour du it ++.
Je ne pense pas qu’il y ait quelque chose d’aussi simple que vous voudriez. Idéalement, vous pourriez faire quelque chose comme
void dumpSsortingngs(AbstractIterator beg, AbstractIterator end) { }
mais les iterators du TSL ne semblent pas avoir de hiérarchie d’inheritance, assez irritant. Il semble donc que vous ayez à vous en servir avec des modèles de fonctions – c’est comme cela que se passe dans la bibliothèque d’algorithmes STL .
Désolé, j’aimerais qu’il y ait un meilleur moyen aussi, mais cela devra être fait. N’oubliez pas de déclarer le modèle de fonction complet dans le fichier d’en-tête!
S’il vous plaît essayez ceci, cela fonctionnerait dans tous les conteneurs:
template void disp(T &t) { for( auto itr=t.begin();itr!=t.end();itr++) cout<<*itr< v(3,77); list l(5,"Hello"); disp(l) disp(v);
Remarque: N’oubliez pas d’inclure < ssortingng >,
Et auto est disponible en c ++ 11