La seguente funzione applica un funtore su ogni elemento e riduce il valore di ritorno:modello Iterator-riduttore per le funzioni che possono o non possono restituire un valore
template <class FCT, class RED>
RED::TYPE forAllElements(FCT functor, RED reducer){
for(/* all elem in elements */){
reducer(functor(elem));
}
return reducer.value;
}
Ora, a volte potrei desiderare di chiamare solo il functor
su tutti gli elementi, e non ridurre nulla. In sostanza, Vorrei poi avere qualcosa di simile:
class FunctorThatReturnsNothing{
void operator() (Elem e){
// do something, return nothing...
}
}
class DummyReducer{
using TYPE = void; // ??? something like that ???
template <class FCT>
void operator() (/* ??? what here */){
// do nothing...
}
}
forAllElements(FunctorThatReturnsNothing(), DummyReducer());
Ma questo non verrà compilato dal momento che ho reducer(functor(elem))
in cui il valore di ritorno inesistente di una funzione void è preso come argomento.
C'è un modo per farlo funzionare per i void functors senza duplicare forAllElements per un void
e un caso diverso da void
?
(Per le persone che sospettano un XY-Problema:. Io fondamentalmente so approcci diversi per l'iterazione e la riduzione e penso che l'approccio callback presentato è appropriato per il mio caso mi chiedo come posso evitare di avere il codice duplicato per il "valore di ritorno + riduzione" e il "solo callback" caso.)
Quindi, in pratica si vuole [ 'std :: for_each'] (http://en.cppreference.com/w/ cpp/algoritmo/for_each)? –
@JoachimPileborg, vedere l'ultima parte della domanda tra parentesi. So che potrei seguire questa strada con gli iteratori, ma nella situazione attuale, una soluzione di callback come presentata è favorevole. – Michael
L'approccio più pulito sarebbe "restituire riduttore" anziché "restituire reducer.value". Puoi refactoring il tuo codice per usarlo? – filipos