Exploiter les classes locales avec les algorithmes STL
En explorant la nature multiforme des algorithmes STL, vous pouvez vous interroger sur l'incapacité d'utiliser des classes définies localement comme prédicats au sein de ces algorithmes. Les origines de cette restriction se situent dans le cadre de la norme C 98/03.
Selon l'article 14.3.1 de la norme, des limitations s'appliquent aux types servant de paramètres de modèle. Parmi ces contraintes figure l'interdiction des types locaux, des types dépourvus de lien, des types sans nom ou des types dérivés de toute combinaison de ceux-ci.
template <class T> class Y { /* ... */ }; void func() { struct S { /* ... */ }; //local class Y< S > y1; // error: local type used as template-argument Y< S* > y2; // error: pointer to local type used as template-argument }
Cette restriction, bien que non intentionnelle, a persisté en raison de la lenteur de l'évolution des normes. . Néanmoins, les compilateurs contemporains, adoptant les progrès des versions C ultérieures, autorisent désormais généralement l'utilisation de types locaux dans les algorithmes.
Exemple :
#include <vector> #include <algorithm> int main() { int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; std::vector<int> v(array, array + 10); struct even : public std::unary_function<int, bool> { bool operator()(int x) { return !(x % 2); } }; std::remove_if(v.begin(), v.end(), even()); // compiles successfully return 0; }
Dans l'actuel Dans le paysage C, l'utilisation de types définis localement dans les algorithmes STL est devenue une pratique courante, tout comme l'introduction d'expressions lambda, améliorant encore davantage les algorithmes. flexibilité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!