una que programacion orientada objetos objeto miembros metodos espaƱol codigo clases clase caracteristicas c++ stl stl-algorithm

c++ - que - Usar clases locales con algoritmos STL



que es una clase en programacion (2)

Está explícitamente prohibido por el estándar C ++ 98/03.

C ++ 11 elimina esa restricción.

Para ser más completo:

Las restricciones sobre los tipos que se utilizan como parámetros de plantilla se enumeran en el artículo 14.3.1 del estándar C ++ 03 (y C ++ 98):

Un tipo local, un tipo sin enlace, un tipo sin nombre o un tipo compuesto a partir de cualquiera de estos tipos no se utilizarán como un argumento de plantilla para un parámetro de tipo de plantilla.

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 }

Fuente y más detalles: http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=420

En resumen, la restricción fue un error que se habría solucionado antes si el estándar evolucionaba más rápido ...

Eso dijo hoy que la mayoría de las últimas versiones de compiladores comunes lo permiten, junto con proporcionar expresiones lambda.

Siempre me he preguntado por qué no se pueden usar clases definidas localmente como predicados para los algoritmos STL.

En la pregunta: Acercándose a los algoritmos STL, lambda, clases locales y otros enfoques , BubbaT menciona que '' Dado que el estándar C ++ prohíbe el uso de tipos locales como argumentos ''

Código de ejemplo:

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 }

¿Alguien sabe en qué parte de la norma está la restricción? ¿Cuál es la razón fundamental para rechazar los tipos locales?

EDITAR : desde C ++ 11, es legal usar un tipo local como argumento de plantilla.


La restricción se eliminará en ''0x, pero no creo que los use mucho. ¡Y eso es porque C ++ - 0x va a tener 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); }) }

Mi sintaxis en lo anterior puede no ser perfecta, pero la idea general está ahí.