В настоящее время я использую в качестве возвращаемого типа:
Код: Выделить всё
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
Мобильная версия