Каковы преимущества использования boost::any_range
? Вот пример:Каковы преимущества использования 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);
}
Но та же функция с большей эффективностью может быть достигнут с помощью параметра шаблона, который удовлетворяет концепцию ForwardRange:
template <class ForwardRange>
void display_integers(const ForwardRange& rng)
{
boost::copy(rng,
std::ostream_iterator<int>(std::cout, ","));
std::cout << std::endl;
}
Так что я ищу для сценариев, когда это стоит использовать any_range. Может быть, я чего-то не хватает.
Помимо скрытия реализации, компилятор будет генерировать одно определение функции display_integers, а не генерировать версию для каждого используемого типа итератора. Это называется * code bloat *. –
@ DavidRodríguez-dribeas, я уже сказал это: «в первом случае display_integers будут скомпилированы только один раз ...». Но обратите внимание: в случае стирания типа - разные классы «Реализация» будут генерироваться, когда вы передадите значения разных типов, это не «бесплатно». –
Да, я просто хотел подчеркнуть, что прямая импликация уменьшает размытие кода шаблона * –