Мне очень нравится использовать cmcstl2, реализацию диапазонов TS. Мне особенно нравятся необязательные проекции на каждый STL-алгоритм. Invocable
типы получить переадресованы (ЭУ ... или нет), как это: (min_element.hpp)Как правильно переадресовывать Invocable типы
template <ForwardIterator I, Sentinel<I> S,
class Comp = less<>, class Proj = identity>
requires
IndirectStrictWeakOrder<
Comp, projected<I, Proj>>()
I min_element(I first, S last, Comp comp = Comp{}, Proj proj = Proj{});
template <ForwardRange Rng, class Comp = less<>, class Proj = identity>
requires
IndirectStrictWeakOrder<
Comp, projected<iterator_t<Rng>, Proj>>()
safe_iterator_t<Rng>
min_element(Rng&& rng, Comp comp = Comp{}, Proj proj = Proj{})
{
return __stl2::min_element(__stl2::begin(rng), __stl2::end(rng),
__stl2::ref(comp), __stl2::ref(proj));
}
Как Справочно: range-v3 библиотека реализует это следующим образом: (min_element.hpp)
struct min_element_fn {
template<typename I, typename S, typename C = ordered_less, typename P = ident,
CONCEPT_REQUIRES_(ForwardIterator<I>() && Sentinel<S, I>() &&
IndirectRelation<C, projected<I, P>>())>
I operator()(I begin, S end, C pred = C{}, P proj = P{}) const;
template<typename Rng, typename C = ordered_less, typename P = ident,
typename I = range_iterator_t<Rng>,
CONCEPT_REQUIRES_(ForwardRange<Rng>() &&
IndirectRelation<C, projected<I, P>>())>
range_safe_iterator_t<Rng> operator()(Rng &&rng, C pred = C{}, P proj = P{}) const
{
return (*this)(begin(rng), end(rng), std::move(pred), std::move(proj));
}
};
Сейчас я стараюсь понять разницу и аргументацию обоих подходов. Почему я должен принимать Invocable
типы по стоимости в любом случае? Почему я не должен использовать идеальную пересылку для этих типов?
Я понимаю второй подход больше, чем для первого, так как я понимаю методологию принятия аргументов погружения по значению.
Источник: am автор cmcstl2. – Casey
'reference_wrapper' не так легко записать, когда вы передаете большой/изменяемый временный. Я также не думаю, что 1) соответствует чтению других исполнителей, хотя это приятно иметь. –
Я не ожидал получить другой ответ, но я рад. Особенно пример бинарного поиска действительно хорош. – Maikel