Utilisation de classes locales avec des algorithmes STL : démêler la restriction de type local
Dans le domaine de la programmation C, les classes locales ont longtemps été interdites car prédicats pour les algorithmes STL, soulevant des questions sur la restriction sous-jacente et sa justification.
Le C La norme 98/03 interdit explicitement les types locaux comme arguments de modèle, y compris les classes locales. L'article 14.3.1 de la norme stipule sans équivoque que "les types locaux [...] ne doivent pas être utilisés comme argument-modèle pour un paramètre de type de modèle."
La justification de cette restriction découle de l'éphémère nature des types locaux. Comme ils existent dans un cadre limité, leurs destructions peuvent se produire de manière inattendue, conduisant potentiellement à un comportement indéfini lorsqu'ils sont utilisés comme prédicats pour les algorithmes STL.
Cependant, avec l'avènement du C 11, cette restriction a été levée. La norme révisée permet d'utiliser des types locaux comme arguments de modèle, permettant ainsi aux classes locales de servir de prédicats pour les algorithmes STL.
Par exemple, considérons l'extrait de code suivant :
#include <algorithm> #include <vector> int main() { int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; std::vector<int> v(array, array + 10); struct even { bool operator()(int x) { return !(x % 2); } }; std::remove_if(v.begin(), v.end(), even()); }
Dans ce code, la classe locale définit même un prédicat qui vérifie les nombres pairs. Cette classe peut désormais être utilisée directement comme argument de l'algorithme std::remove_if, qui supprime tous les nombres pairs du vecteur v.
Alors que la restriction sur les types locaux visait initialement à se prémunir contre un comportement potentiel indéfini, sa suppression dans C 11 a ouvert de nouvelles possibilités d'utilisation de classes locales dans des scénarios de programmation fonctionnelle.
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!