Ho difficoltà a fare una scelta di progettazione nella seguente configurazione:
Sto scrivendo (C ++) funzioni che prendono una coppia di iteratori (in contenitori di template) e calcolano un valore di ritorno dello stesso tipo a cui gli iteratori puntano.
Diciamo che voglio implementare una funzione somma (questo è solo un esempio per illustrare il punto).
Per come la vedo io ho due opzioni e entrambe hanno uno svantaggio:
Opzione 1
Rendi il parametro del template funzione T
definendo il tipo che il contenitore memorizza.
Ho solo bisogno di un parametro, ma posso usare la funzione solo su iteratori di MyContainer
.
template <class T>
T sum(typename MyContainer<T>::IteratorRange range){
T sum;
for (auto it = range.first; it < range.second; ++it) {
sum += *it;
}
return sum;
}
Opzione 2
Chiedi alla funzione di assumere una classe di template IteratorRange
arbitraria
e una seconda classe U
che determina il tipo di ritorno.
Mentre gli iteratori possono essere originati da qualsiasi contenitore, ho bisogno di due classi template anche se il tipo restituito è sempre lo stesso tipo puntato dagli iteratori.
template <class IteratorRange, class U>
U sum(IteratorRange range){
U sum;
for (auto it = range.first; it < range.second; ++it) {
sum += *it;
}
return sum;
}
Quale opzione è più pulita o esiste un'alternativa che offra i vantaggi di entrambe le opzioni?
Domanda bonus
Come si dovrebbe inizializzare la variabile sum
?