Тип затухающего итератора stl - PullRequest
0 голосов
/ 09 декабря 2018

Предположим, у меня есть интерфейс, который возвращает диапазон значений.Реализация этого интерфейса может использовать разные контейнеры для предоставления этих чисел.

class MyClassI
{
public:
  virtual std::pair<std::vector<int>::iterator, std::vector<int>::iterator> Numbers() const = 0;
}

class MyClassC : public MyClassI
{
public:
  virtual std::pair<std::vector<int>::iterator, std::vector<int>::iterator> Numbers() const 
     { return std::make_pair(numbers.begin(), numbers.end(); }
private:
   std::vector<int> numbers;
}

Интересно, есть ли способ "затухания" типа контейнера от итератора.

class MyClassI
{
public:
  virtual std::pair<decayed_iterator<int>, decayed_iterator<int>> Numbers() const = 0;
}

Конечно, я могу поместить оригинальный итератор в кучу, и я могу обернуть этот указатель классом шаблона, чтобы обеспечить тип значения в качестве итератора.

Интересно, уже есть что-то подобное в boost иличто-то вне себя.

Я могу представить себе что-то вроде функции std / boost, где вызываемый объект исчезает (если это функция или структура), а часть "state" хранится внутри объекта.если он достаточно мал, чтобы избежать выделения кучи - если возможно.

1 Ответ

0 голосов
/ 20 января 2019

Кажется, у Boost уже есть ответ.Библиотека «Range» предоставляет адаптер диапазона (boost :: adapters :: type_erased), который разлагает контейнер или другие уже примененные адаптеры.Таким образом, мы наконец получаем boost :: any_range, который кроме итерированного типа имеет некоторые другие параметры, но больше не контейнер

https://www.boost.org/doc/libs/1_69_0/libs/range/doc/html/range/reference/adaptors/reference/type_erased.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...