Как `list_of` boost конвертирует в другие коллекции? - PullRequest
2 голосов
/ 28 апреля 2011

Является ли документация, описывающая, как list_of внутренне * boost преобразует в другую коллекцию?

В частности, какую роль adapter_converter и converter заполняет процесс неявного преобразования.

1 Ответ

1 голос
/ 29 апреля 2011

Я не смог найти документ о внутренностях list_of.Ниже очень упрощенная версия list_of.Возможно, детали реализации будут отличаться в разных версиях, но я полагаю, что базовый процесс примерно такой, как следующий.Суть вопроса в том, что преобразование в другие коллекции реализовано с помощью шаблонной функции преобразования.

EDIT : Контейнеры-адаптеры IIRC, такие как std::stack/queue, не могут быть созданы / назначены из диапазона.Таким образом, to_adapter возвращает adapter_converter вместо непосредственного создания контейнера назначения.Функция шаблонного преобразования в adapter_converter создает контейнер адаптера с push.
Что касается класса converter, то, на мой взгляд, это своего рода смесь.Он используется для сокрытия деталей и в некоторой степени обеспечивает абстракцию.Тем не менее, я думаю, что это не имеет большого отношения к сути вопроса (преобразование в несколько коллекций) напрямую.

template< class T >
struct generic_list {
  typedef std::deque< T > converter;
  converter values_;

  generic_list& operator()( T const& u ) {
    values_.push_back( u );
    return *this;
  }

  template< class Container >
  operator Container() const { // conversion function
    return Container( values_.begin(), values_.end() );
  }

  struct adapter_converter {
    converter const &gl;

    adapter_converter( converter const& gl ) : gl( gl ) {}

    template< class Adapter >
    operator Adapter() const { // conversion function for adapter
      Adapter a;
      converter::const_iterator i = gl.begin(), e = gl.end();
      for ( ;  i != e;  ++ i ) a.push( *i );
      return a;
    }
  };

  adapter_converter to_adapter() const {
    return adapter_converter( values_ );
  }
};

template< class T >
generic_list<T> list_of( T const& t ) {
  return generic_list<T>()( t );
}

int main() {
  std::stack< int > s = list_of(1)(2).to_adapter();
  std::queue< int > q = list_of(3)(4).to_adapter();
}

Надеюсь, это поможет

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