Quali sono i vantaggi dell'utilizzo di boost::any_range
? Ecco un esempio:Quali sono i vantaggi dell'utilizzo di boost :: any_range?
typedef boost::any_range<
int
, boost::forward_traversal_tag
, int
, std::ptrdiff_t
> integer_range;
void display_integers(const integer_range& rng)
{
boost::copy(rng,
std::ostream_iterator<int>(std::cout, ","));
std::cout << std::endl;
}
int main(){
std::vector<int> input{ ... };
std::list<int> input2{ ... };
display_integers(input);
display_integers(input2);
}
Ma la stessa funzionalità con maggiore efficienza può essere realizzato con un parametro di template, che soddisfa il concetto ForwardRange:
template <class ForwardRange>
void display_integers(const ForwardRange& rng)
{
boost::copy(rng,
std::ostream_iterator<int>(std::cout, ","));
std::cout << std::endl;
}
Così sto cercando per gli scenari in cui è vale la pena usare any_range. Forse mi manca qualcosa.
Oltre a nascondere l'implementazione, il compilatore genera una singola definizione della funzione 'display_integers', anziché generare una versione per ogni tipo di iteratore che sia mai stata utilizzata. Questo è chiamato * codice bloat *. –
@ DavidRodríguez-dribeas, ho già detto questo: "nel primo caso display_integers verrà compilato solo una volta ...". Ma nota, in caso di cancellazione del tipo - diverse classi di "Implementazione" saranno generate quando passerai valori di tipi diversi, non è "libero". –
Sì, volevo solo sottolineare che l'implicazione diretta sta riducendo il codice * template bloat * –