Повышение общего итератора контейнера эквивалентно в стандартном C ++ - PullRequest
1 голос
/ 29 января 2020

У меня есть фрагмент кода, содержащий boost :: shared_container_iterator, который нуждается в boost :: shared_ptr, который в свою очередь использует устаревший std :: auto_ptr.

Я хотел бы избавиться от всех зависимостей auto_ptr, но я не знаете, как это сделать в этом случае.

Есть ли в стандартной библиотеке аналог boost :: shared_container_iterator? Насколько я понимаю, он используется в качестве генератора, так что, может быть, std :: input_iterator - хорошая альтернатива?

1 Ответ

2 голосов
/ 29 января 2020

Нет, но boost::shared_container_iterator настолько прост (почти вся работа выполняется с помощью boost::iterator_adaptor), что вы должны быть в порядке, чтобы скопировать его в свою собственную служебную библиотеку, изменив boost::shared_ptr на std::shared_ptr ( и обновление стиля кодирования):

template<class Container>
class shared_container_iterator :
    public boost::iterator_adaptor<shared_container_iterator<Container>, typename Container::iterator>
{
    std::shared_ptr<Container> ref;
public:
    shared_container_iterator() = default;
    shared_container_iterator(typename Container::iterator x, std::shared_ptr<Container> c) :
        shared_container_iterator::iterator_adaptor(x), ref(std::move(c)) {}
};

template<class Container>
auto make_shared_container_range(std::shared_ptr<Container> const& container) {
    return boost::make_iterator_range(
        shared_container_iterator{container->begin(), container},
        shared_container_iterator{container->end(), container});
}

Обратите внимание, что здесь по-прежнему используется Boost.IteratorAdaptor , но это хорошо для использования в современном C ++.

Пример . * * 1014

...