построить пролет с карты - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть карта, которую я буду sh возвращать с пролетом, как показано ниже

map<string, map<string, Struct>> map;
span<pair<string, map<string, Struct>>> s {map.begin(), map.end()};

, которая не компилируется с жалобой на отсутствие известного преобразования из map :: iterator в промежуток шаблонного типа. Я не уверен, почему это терпит неудачу, так как из того, что я понимаю, конструктор диапазона итератора должен разложить итератор карты (на пару>), а затем «скопировать» это. Что мне здесь не хватает?

Скомпилировано с clang8

Ответы [ 2 ]

4 голосов
/ 04 апреля 2020

std::span может использоваться только для совокупности смежных и конгруэнтных элементов в памяти, которых нет std::map.

std::span

Диапазон шаблона класса описывает объект, который может ссылаться на непрерывную последовательность объектов с первым элементом последовательности в нулевой позиции.

Типичная реализация содержит только два члена: указатель на T и размер.

0 голосов
/ 04 апреля 2020

C ++ 20 предлагает диапазоны, которые будут работать с картой.

Однако вы можете переосмыслить, почему вы на самом деле делаете это. Основная цель std::span - предоставить интерфейс контейнера C ++ для необработанного блока памяти. Карта уже предоставляет интерфейс контейнера C ++.

...