2010-05-26 11 views
6

Ho una classe contenitore (contenente un contenitore multiindice) per la quale ho una funzione membro "foreach" pubblica, quindi gli utenti possono passare un functor da applicare su tutti gli elementi
Durante l'implementazione, ho avuto un caso in cui il functor deve essere applicato solo ad alcuni elementi di un intervallo nel contenitore, quindi ho sovraccaricato il foreach, per passare un intervallo valido.
Ora, in alcuni casi, è valsa la pena fermarsi a una determinata condizione, quindi, praticamente, lascio che il foreach si fermi in base al valore di ritorno della funzione.Nome migliore necessario per applicare una funzione sugli elementi di un contenitore

Sono soddisfatto di come funziona il sistema, ma ho una preoccupazione:
Come dovrebbe un "foreach" su una serie, con le condizioni di stop essere chiamato?
Qualcuno conosce un nome generico, chiaro e conciso?

+0

fino a __________ – kenny

risposta

6

Sulla base della descrizione, vorrei andare per apply_until().

+0

Mi piace il nome apply _... perché mostra che è un'interfaccia per applicare le funzioni. Stranamente, l'ho inserito nel titolo, ma non mi è venuto in mente di usarlo come nome di una funzione. Immagino, foreach era bloccato troppo nella mia testa. – stefaanv

0

un nome generico? ConditionalIterator? RangeIterator? O dal momento che è una funzione, forse IterateRange?

0

Che ne dici di find_if(...), come in stl?

2

Forse until o qualcosa del genere?

1

probabilmente sarei lo chiamo o foreach_until o foreach_while (il tentativo di seguire una convenzione in base alle _if funzioni come replace_if e remove_if, salvo che la condizione qui non è "se" ognuno è vero, è "fino a quando" la condizione finale vale). O solo foreach. std::for_each ignora il valore di ritorno del functor, ma ciò non significa necessariamente che la funzione chiamata foreach debba. Penso che sia un idioma piuttosto comune per una funzione di callback avere un valore di ritorno che consente l'uscita anticipata dal ciclo di controllo.

Se il callback restituisce un valore falso (per continuare) o un valore vero (da interrompere), è possibile chiamare la funzione find_if. Questo è fondamentalmente quello che è, e potrebbe essere implementato usando std::find_if, anche se il chiamante non è interessato a quale iteratore ha provocato la condizione di fine.

+0

Sono incuriosito da find_if, perché viene risposto due volte. Ho pensato che "trova ..." - le funzioni riguardano i membri di ritorno e che "... se" le funzioni utilizzavano "predicati" come in "funzioni pure che restituiscono un valore booleano basato su una determinata condizione". Sono troppo severo? – stefaanv

+0

I predicati restituiscono un valore "verificabile come true", non necessariamente un valore booleano. Non è necessario che siano puri, ma non devono chiamare le funzioni non const sui loro parametri: ho trascurato di menzionarlo come condizione. Tutto in 25/7. Hai ragione che le funzioni di 'find' riguardano la restituzione dell'iteratore che ha attivato lo" stop ", ma puoi sempre ignorare un valore di ritorno. In realtà intendo solo che se find_if è abbastanza vicino a ciò che vuoi, allora usalo anche se concettualmente non stai trovando nulla. Se non è "abbastanza vicino", non usare quel nome :-) –

1

Se è possibile fornire una funzione di sottoinsieme che restituisce una vista degli elementi di interesse, forse non è necessario apply_until(). Solo myContainer.subset(3, 17).foreach(myFunctor) Penso che sia una migliore separazione delle preoccupazioni.

+0

Wow, una sorta di approccio diverso. Suona bene.Praticamente per me, significherebbe avere un'altra classe (il sottoinsieme) con accesso al contenitore interno, però. – stefaanv

+0

Ripensandoci, servirebbero solo 2 iteratori, quindi dovrei tenerlo a mente – stefaanv

Problemi correlati