Моє запитання: Чи зможемо ми побудувати (існуючі) стандартні бібліотечні контейнери з будь-яким діапазоном? І що ще важливіше, з видом діапазону?
Ні. Єдиний стандартний компонент бібліотеки, який можна сконструювати з довільного діапазону, який відповідає правильним критеріям std::span<T>
.
Напрямок, до якого, ймовірно, піде стандартна бібліотека, є той, до якого також іде діапазон-v3 (зауважте, що пов'язаний приклад з range-v3 компілюється, але попереджає про застарілу конверсію) - використовуючи помічник для перетворень для вас:
std::vector<int> squares =
std::ranges::views::transform(vec, sq) | std::ranges::to<std::vector>;
Одну з причин не йти у напрямку конструкторів діапазону видно з самого прикладу, який ви використовуєте:
std::vector<int> squares { std::ranges::views::transform(vec, sq) };
Поміркуйте, чим відрізняється ця декларація від цих двох:
std::vector v { std::ranges::views::transform(vec, sq) };
std::vector w ( std::ranges::views::transform(vec, sq) );
v
обов'язково буде vector<transform_view<...>>
містити сингл transform_view
, тоді як w
буде a vector<int>
.
Більше того, додавання більше, ретельно обмежених конструкторів контейнерів до стандартної бібліотеки все одно не допоможе стороннім типам контейнерів - в той час як об'єкт на зразок ranges::to
працює чудово у всіх випадках.