У меня есть функции, которые принимают итераторы std::vector
, как в
typedef std::vector<Point> Points;
Points ConvexHull(Points::const_iterator first, Points::const_iterator last);
Я обычно передаю им итераторы std
, но иногда мне нужно работать с boost
итераторами, такими как boost::join
итератор диапазона. Как я должен изменить параметризацию своих функций, в идеале без шаблонов, чтобы они принимали оба итератора? Кроме того, как мне указать в каждом типе, какие концепции итераторов мне нужны?
Я попытался просмотреть документацию boost::range
, но это меня смущает, и я не знаю, с чего начать.
Например, я не смог найти разницу между boost::range_details::any_forward_iterator_interface
и boost::range_details::any_forward_iterator_wrapper
и должен ли я использовать любой из них, чтобы указать, что мне нужен прямой итератор.
Edit:
Если я использую boost::any_range
, как я могу передать неконстантные ссылки на lvalue?
Например:
template<typename T>
using Range = boost::any_range<T, boost::random_access_traversal_tag,
T, std::ptrdiff_t>;
f(Range<Point> &points); // defined elsewhere
// -------------
vector<Point> vec;
f(vec); // error; cannot bind non-const lvalue reference to unrelated type