Если у нас когда-либо есть только один выбранный элемент за раз, мы можем просто вернуть ссылку, но что, если необходимо вернуть несколько непересекающихся выбранных элементов (непересекающийся выбор) - теоретически это может быть даже в разных контейнерах.
В настоящее время я использую в качестве тип возвращаемого значения:
Код: Выделить всё
std::vector
Обратите внимание, что использование const std::reference_wrapper прекрасно решит эту проблему (эффективно отключает перепривязку, но все же разрешает базовые элементы быть измененным) это не разрешено в большинстве контейнеров и попадает в static_assert (я предполагаю, что они основаны на куче...).
Это правило константности в контейнерах можно обойти, введя "самодельный" класс: const_reference_wrapper - хотя на самом деле это может работать нормально - очень "шумно" вводить самодельные оболочки только для того, чтобы вернуть список выбранные элементы.
Другое решение, которое может быть даже лучше, — использовать библиотеку диапазонов и возвращать ссылки в диапазоне элементов. Используя концепции, мы можем даже ограничить тип возвращаемого значения, чтобы помочь пользователям:
Код: Выделить всё
template
concept RangeOf = std::ranges::range &&
std::same_as;
Код: Выделить всё
RangeOf auto
Мне интересно, может ли быть более простое решение или, может быть, что-то в более новых версиях, которое могло бы сделать возможным правильное (т.е. типобезопасное) представление «выбора» элементов (теоретически может даже быть в разных контейнерах)?
Подробнее здесь: https://stackoverflow.com/questions/798 ... -in-a-type
Мобильная версия