2010-05-26 6 views
6

Tengo una clase de contenedor (que contiene un contenedor de varios índices) para el que tengo una función de miembro pública "foreach", para que los usuarios puedan pasar un functor para aplicar en todos los elementos
Durante la implementación, tuve un caso en el que el functor solo debería aplicarse a algunos elementos de un rango en el contenedor, por lo que sobrecargué el foreach, para pasar un rango válido.
Ahora, en algunos casos, valió la pena detenerse en una determinada condición, por lo que prácticamente dejo que el foreach se detenga en función del valor de retorno de la función.Mejor nombre necesario para aplicar una función en los elementos de un contenedor

estoy contento con cómo funciona el sistema, pero no tengo una preocupación:
¿Cómo debería un "foreach" en un rango, con condiciones de parada se llama?
¿Alguien sabe un nombre genérico, claro y conciso?

+0

hasta __________ – kenny

Respuesta

6

De acuerdo con su descripción, iría por apply_until().

+0

Me gusta el nombre de aplicación _... porque muestra que es una interfaz para aplicar funciones. Por extraño que parezca, lo puse en el título, pero no se me pasó por la mente usarlo realmente como nombre de función. Supongo que foreach estaba demasiado metido en mi cabeza. – stefaanv

0

nombre genérico? ConditionalIterator? RangeIterator? O como es una función, ¿quizás IterateRange?

0

¿Qué tal find_if(...), as stl?

2

Tal vez until o algo?

1

probablemente me llamo ya sea foreach_until o foreach_while (intentar seguir una convención basada en las funciones como _ifreplace_if y remove_if, pero la condición de que aquí no es "si" cada uno es cierto, es "hasta" la condición final es válida). O solo foreach. std::for_each ignora el valor de retorno del funtor, pero eso no necesariamente significa que su función llamada foreach tiene que hacerlo. Creo que es una expresión bastante común para una función de devolución de llamada tener un valor de retorno que permita la salida anticipada del bucle de control.

Si la devolución de llamada devuelve un valor falso (para continuar) o un valor verdadero (para detener), puede llamar a la función find_if. Eso es básicamente lo que es, y podría implementarse usando std::find_if, incluso si la persona que llama no está interesada en qué iterador provocó la condición final.

+0

Me intriga el find_if, porque se responde dos veces. Pensé que "encontrar ...": las funciones se refieren a los miembros que regresan y que las funciones "..._ si" usaban "predicados" como en "funciones puras que devuelven un booleano en función de alguna condición". ¿Estoy siendo muy estricto? – stefaanv

+0

Los predicados devuelven un valor "comprobable como verdadero", no necesariamente un booleano. No se requiere que sean puros, pero no deben llamar a las funciones no const en su parámetro: descuidé mencionar eso como una condición. Todo en 25/7. Tiene razón en que las funciones 'find' se refieren a devolver el iterador que activó el" stop ", pero siempre puede ignorar un valor de retorno. Realmente solo quiero decir que si 'find_if' está" lo suficientemente cerca "de lo que quieres, entonces úsalo aunque conceptualmente no encuentres nada. Si no está "lo suficientemente cerca", no use ese nombre :-) –

1

Si puede proporcionar una función de subconjunto que devuelve una vista de los elementos de interés, tal vez no necesite apply_until(). Solo myContainer.subset(3, 17).foreach(myFunctor) Creo que es una mejor separación de preocupaciones.

+0

Wow, una especie de enfoque diferente. Suena bien.Prácticamente para mí, significaría tener otra clase (el subconjunto) con acceso al contenedor interno. – stefaanv

+0

Pensándolo bien, solo necesitaría 2 iteradores, así que debería tener esto en cuenta – stefaanv

Cuestiones relacionadas