2012-08-22 17 views
6

¿Alguna vez pasó por el proceso de reemplazar el BOOST_FOREACH por el bucle for basado en el rango? ¿Hay algún truco al hacerlo mecánicamente (es decir, no hacer un estudio profundo del código).¿Alguna experiencia con el reemplazo de BOOST_FOREACH por rango para el ciclo de C++ 11?

Antecedentes: Tengo fuentes con aproximadamente 250K líneas, compiladas con Microsoft VC++ 10 (Visual Studio 2010). El código usa también BOOST_FOREACH de la biblioteca de impulso. Solo estoy probando el VC++ 11 (Visual Studio 2012 RC) que implementa también el bucle for basado en rango con el auto.

Hasta ahora, me he encontrado con la situación en la que se declaró el elemento fuera del BOOST_FOREACH (sin declaración en el paréntesis):

BOOST_FOREACH (element, container) { 
    ... 
} 

... y se esperaba que el element a tener el valor establecido en el loop después del break. ¿Puedes recordar problemas similares ?

Cuando el BOOST_FOREACH contiene la declaración, ¿elegiría reemplazar el tipo explícito por auto? ¿Hay alguna ventaja de hacerlo cuando uno simplemente reescribe mecánicamente el BOOST_FOREACH en lugar de dejar la declaración explícita allí?

Gracias por su ayuda, Petr

Respuesta

4

La ventaja de auto sobre el uso del tipo o tipo de referencia real es que el código seguirá funcionando si cambia el tipo de contenedor. Esto puede no ser lo que desea si está realizando una conversión de tipo intencionalmente como resultado de indirectar el iterador del contenedor.

Ejemplo:

std::vector<int> v; 
for (int i: v) ... 

Si v cambios en std::vector<long> o std::vector<unsigned> entonces la conversión de tipo puede ser no deseado; aún así, una advertencia del compilador debería detectar esto (especialmente para una conversión de estrechamiento). Por otra parte, usted podría tener código donde una conversión (ampliación) está destinado:

std::vector<char> v; 
for (int i: v) ... 
+0

Bueno, entiendo que 'auto' es el ganador cuando se ingresa un nuevo código, como su escritura. Sin embargo, me siento un poco más seguro al dejar el tipo explícito no reemplazado por 'auto'.En primer lugar, tomaría más esfuerzo, y en segundo lugar, podría introducir un error humano al editar. (Hay una gran cantidad de 'BOOST_FOREACH', y no puedo ver el código para cada caso). De todos modos, ¿consideraría mi decisión de mantener el tipo de datos explícito en los nuevos bucles' for' como no- ¿problemático? – pepr

+0

@pepr Acepto que mantener el tipo explícito generalmente será la mejor opción; deberás ser consciente de ello si cambias los tipos de contenedor más tarde. – ecatmur

1

se decide sustituir el tipo explícita por auto?

Sí, pero si el tipo es, p. int& luego lo reemplazaría con auto& de lo contrario, el tipo deducido no será una referencia.

+0

no considero la '' y ser parte de la 'auto' como elemento de cualquier tipo de datos se puede acceder o vía valor o vía referencia. Mi pregunta podría ser precisa si puedo obtener alguna ventaja causada por * reemplazar el tipo de datos explícitos por 'auto' *. Es mejor decir que si el reemplazo del 'BOOST_FOREACH' se puede hacer a través de una expresión regular en el IDE, si tiene sentido pasar el tiempo reemplazando el tipo por' auto'. – pepr

+1

La principal ventaja es si más tarde cambia el tipo de contenedor, con 'auto' no necesita actualizar la variable de bucle. Puede ahorrar tiempo y dejar el código que funciona con tipos explícitos, no hay nada de malo en esa elección. –

Cuestiones relacionadas