2013-11-25 6 views
3

Я мучительно пытаюсь научиться ускорению слияния, и я не понимаю четко различий между zip_view и результатом zip-функции.boost :: fusion :: zip function vs boost :: fusion :: zip_view

namespace fuz = boost::fusion; 

typedef fuz::vector<int,int> vec1; 
typedef fuz::vector<char,char> vec2; 
typedef fuz::vector<vec1&, vec2&> sequences; 

typedef fuz::zip_view<sequences> zip_view_type; 

typedef fuz::result_of::zip<vec1, vec2>::type zip_result_type; 

BOOST_MPL_ASSERT((boost::is_same<zip_view_type, zip_result_type>)); 
  • Я ожидал, что два типа такой же, но они не являются. Зачем?

  • zip_view и функция zip, кажется, очень тесно связаны, но я не знаю Посмотрите, когда/почему использовать представление вместо функции.

+1

Согласно документации 'zip_view',' sequence' должно быть 'fuz :: vector '. 'result_of :: zip', кажется, использует' vector2' вместо 'vector' внутри, поэтому, если вы используете' vector2' в 'vec1',' vec2' и 'sequence', типы кажутся одинаковыми ([live example] (http://coliru.stacked-crooked.com/a/e2bc2f794e33c64c)). Надеюсь, кто-то, кто знает больше, даст вам лучший ответ. – llonesmiz

+0

@cv_and_he: thx, по крайней мере, ваш живой пример демонстрирует diff. Я также попытался использовать type_info, но с g ++ (даже с демензированием имени) вывод был слишком загадочным. Я также исправлю последовательности typedef в моем вопросе. – Laurent

+1

Ok 'vector2' - это просто пронумерованная форма из двух элементов. 'vector' - это вариационная форма. Здесь я понимаю, что 'result_of :: zip :: type' будет использовать нумерованную форму вектора, а zip_view будет использовать тип данной последовательности, таким образом, здесь: вариационная форма вектора (' vector '). – Laurent

ответ

2

Я надеюсь, что смогу ответить на ваш второй вопрос (почему использование zip_view вместо zip).

Дело в том, что zip создает последовательность кортежей, содержащих константа ссылки на соответствующие элементы застегнутых последовательностей. В вашем примере это vector2<const int&, const char&>

Напротив, ссылки в кортежах, создаваемые zip_view для каждого элемента, имеют один и тот же определитель константы, как и zipped-последовательность в конструкторе вида. Это будет vector<int&, char&> в вашем случае.

В результате zip_view позволяет то, что zip не поддерживает:

  1. Модификации элементов молнии последовательностей;
  2. Выбор последовательностей, подлежащих изменению.
Смежные вопросы