Как написать функцию которая может возвращать const_iterator и простой iterator?

Пишу простенький класс который будет разбивать контейнер на подконтейнеры, то есть отрезки. Сам класс:

template <typename Iterator >
class IteratorRange {
private:
    Iterator first, last;
public:
    IteratorRange(Iterator f, Iterator l)
        : first(f)
        , last(l)
    {}
    Iterator begin() const {
        return first;
    }
    Iterator end() const {
        return last;
    }
    size_t size() const {
        return last - first;
    }
};


template <typename Iterator>
class Paginator {
private:
    std::vector<IteratorRange<Iterator>> pages;
public:
    Paginator(Iterator _begin, Iterator _end, size_t _page_size)
    {
        Iterator it = _begin;
        while (it != _end) {
            size_t DistanceToEnd = _end - it;
            pages.push_back({ it, next(it, min(_page_size, DistanceToEnd)) });
            it = next(it, min(_page_size, DistanceToEnd));
        }
    }
    auto begin() const {
        return pages.begin();
    }
    auto end() const {
        return pages.end();
    }
    size_t size() const { return pages.size(); }

};

Хочу реализовать функцию которая будет создавать экземпляр класса (то есть инстанцировать шаблонный клас и возвращать вектор подотрезков), но для константных контейнеров она должна возвращать const_iterator, соответственно для не константных просто iterator, как такое реализовать чтобы не использовать ключевое слово auto?

template <typename C>
??? Paginate(C& c, size_t page_size) {
    return Paginator{ c.begin(), c.end(), page_size };
}

какой тип возврата должен быть?


Ответы (0 шт):