50 votes

Utilisation de classes locales avec des algorithmes STL

Je me suis toujours demandé pourquoi vous ne pouvez pas utiliser localement les classes définies comme des prédicats à des algorithmes de la STL.

À la question: Approche algorithmes de la STL, lambda, classes locales et d'autres approches, BubbaT mentionne dit que"Depuis la norme C++ interdit locaux types à être utilisés comme arguments'

Exemple de code:

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() ); // error
}

Personne ne sait où la norme est la restriction? Quelle est la raison pour rejeter des types locaux?


EDIT: Depuis C++11, il est légal d'utiliser un type local comme un argument de modèle.

53voto

Klaim Points 24511

Il est explicitement interdit par le C++98/03 standard.

C++11 supprimer cette restriction.

Pour être plus complet :

Les restrictions sur les types utilisés comme paramètres du modèle sont listés *dans l'article 14.3.1 du C++03* (et C++98) standard:

Un local type, un type avec pas de lien, un sans nom, type ou d'un type de composé à partir de ces types ne doivent pas être utilisé comme un modèle d'argument pour une modèle type de paramètre.

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 }

Source et plus de détails : http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=420

Pour résumer, la restriction était une erreur qui aurait été fixé plus tôt si la norme était en train d'évoluer plus vite...

Cela dit, aujourd'hui, toutes les dernières versions de la commune de compilateurs ne lui permettent, ainsi que de fournir les expressions lambda.

5voto

Richard Corden Points 12292

La restriction sera supprimée dans '0x, mais je ne pense pas que vous les utiliserez beaucoup. Et c’est parce que C ++ - 0x va avoir des lambdas! :)

 int main() {
   int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
   std::vector<int> v( array, array+10 );

   std::remove_if( v.begin()
                 , v.end()
                 , [] (int x) -> bool { return !(x%2); })
}
 

Ma syntaxe dans ce qui précède n'est peut-être pas parfaite, mais l'idée générale est là.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X