Как вернуть список выбранных элементов некоторого базового контейнера типобезопасным способом?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как вернуть список выбранных элементов некоторого базового контейнера типобезопасным способом?

Сообщение Anonymous »

Мне интересно, есть ли лучший, более типобезопасный способ вернуть «выборку», чем я делаю сейчас.
В настоящее время я использую в качестве возвращаемого типа:

Код: Выделить всё

std::vector
В некотором роде это работает нормально, но я хотел бы избавиться от молчаливой ошибки повторной привязки в reference_wrapper (например, при попытке обновить базовое значение).

Обратите внимание, что использование const std::reference_wrapper решит эту проблему (эффективно отключает перепривязку, но по-прежнему позволяет базовым элементам быть изменено) это не разрешено в большинстве контейнеров и обращений к static_assert (я предполагаю, что они основаны на куче...).
Это правило константности в контейнерах можно обойти, введя "самодельный" класс: const_reference_wrapper - хотя на самом деле это может работать нормально - очень "шумно" вводить самодельные оболочки только для того, чтобы вернуть список выбранных элементы.

Другое решение, которое может быть даже лучше, — использовать библиотеку диапазонов и возвращать ссылки в диапазоне элементов. Используя концепции, мы можем даже ограничить тип возвращаемого значения, чтобы помочь пользователям:

Код: Выделить всё

template 
concept RangeOf = std::ranges::range &&
std::same_as;
тогда возвращаемый тип будет выглядеть так:

Код: Выделить всё

RangeOf auto
Тем не менее, иногда для помощи пользователям предпочтительнее использовать более «надежный» тип, чем auto (даже с учетом вспомогательной концепции). И ни одно из этих решений не является идеальным по разным описанным причинам (перепривязка, шаблон, простота использования/читабельность).
Мне интересно, может ли быть более простое решение или, может быть, что-то в более новых версиях, которое могло бы сделать возможным правильное (т.е. типобезопасное) представление «выбора» элементов (теоретически может даже быть в разных контейнерах)?

Подробнее здесь: https://stackoverflow.com/questions/798 ... -in-a-type
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»