Обобщенный container_view
правильнее называть диапазоном. У нас есть TS на маршруте, полностью посвященный концепциям дальности.
Теперь у нас есть string_view
как отдельный тип, потому что он имеет специализированный, специфичный для строк интерфейс, чтобы соответствовать специфичному для строки интерфейсу basic_string
. Или, по крайней мере, чтобы соответствовать интерфейсам const/non-allocating.
Обратите внимание, что container_view
или как бы вы его ни назвали, не сможет стереть свое соединение с контейнером, который его сгенерировал. Или, по крайней мере, не без оплаты накладных расходов на стирание типа при каждом доступе/операции.
Напротив, string_view
основано на const char*
s и целых числах. Этому классу все равно, откуда взялась строка; он обеспечивает просмотр непрерывного массива символов независимо от того, кому он принадлежит. Он может сделать это, потому что знает, что источником является непрерывный массив, и поэтому использует указатели в качестве ядра своего итератора.
Вы не можете сделать это для произвольных контейнеров. Ваш container_view<vector>
будет иметь итераторы, отличные от container_view<list>
или чего-то еще. Это должно. Это означает, что если вы принимаете container_view
в качестве параметра функции, вы должны либо выбрать конкретный контейнер для использования (заставляя пользователя указать именно этот тип контейнера), либо сделать свою функцию шаблоном, либо использовать диапазон итератора со стертым типом (таким образом помедленнее).
Существуют также предложения после C++17 для типов GSL span
и mdspan
. Первый представляет собой модифицируемое "представление" непрерывного массива. Последний представляет собой модифицируемое «представление» непрерывного массива, который вы считаете многомерным.
person
Nicol Bolas
schedule
19.08.2016
observer_ptr
просто создает путаницу и отвлекает от вопроса о том, должно ли быть обобщенноеcontainer_view
вместо конкретногоstring_view
. - person juanchopanza   schedule 19.08.2016const char*
, ноstring_view
имеет дополнительное предположение, что такой указатель указывает на строку, завершающуюся\0
, когда он создается с помощью этого конструктора с одним указателем. - person Johannes Schaub - litb   schedule 20.08.2016