Ответ 1
Обобщенный container_view
более правильно называется диапазоном. У нас есть TS-маршрут, полностью посвященный концепциям диапазона.
Теперь у нас есть string_view
как отдельный тип, потому что у него есть специализированный, специфичный для строки интерфейс для соответствия basic_string
связанного с строкой интерфейса. Или, по крайней мере, для соответствия интерфейсам const/non-allocating.
Обратите внимание, что container_view
или то, что вы его вызывали, не сможет удалить его соединение с контейнером, который его создал. Или, по крайней мере, не без оплаты служебных данных стирания на каждом доступе/операции.
В отличие от этого, string_view
основан на const char*
и целых числах. Этот класс не волнует, откуда взялась строка; он обеспечивает представление в смежном массиве символов независимо от того, кто его владеет. Он может это сделать, потому что он знает, что источник является непрерывным массивом и поэтому использует указатели как ядро его итератора.
Вы не можете сделать это для произвольных контейнеров. У вашего container_view<vector>
будут разные итераторы от container_view<list>
или что угодно. Это должно было бы. Это означает, что если вы берете container_view
как параметр функции, вы должны либо выбрать конкретный используемый контейнер (заставляя пользователя предоставлять именно этот тип контейнера), сделать вашу функцию шаблоном или использовать диапазон итераторов с стиранием типа ( таким образом, медленнее).
Есть также предложения post-С++ 17 для типов GSL span
и string_span
. Первый представляет собой модифицируемое "представление" (возможно многомерного) смежного массива. Последний представляет собой изменяемый "вид" непрерывной строки.