Extendable tuple-like/pair-like concepts or the friendship between std::views::elements and custom Pair
Описание идеи
Хочется расширить концепты tuple-like и (транзитивно) pair-like. Сейчас этот концепт очень рестриктивен – тип должен быть специализацией одного из стандартных шаблонов: std::complex, std::array, std::pair, std::tuple, std::ranges::subrange. Предлагается сформулировать требования к концепту и реализовать его так, чтобы ему удовлетворяли все типы, которые семантически представимы как tuple. Например, типы, для которых ADL выводит get, определён tuple_size и так далее.
Примеры
На данный момент (C++23) концепты pair-like и tuple-like бесполезны в контексте кастомных типов и структур. Самый простой пример: у меня есть структура из двух полей и я положил её в вектор. Затем я беру std::views::values и хочу воспользоваться им, чтобы проитерироваться по второму полю структуры, но не тут то было. Концепт pair-like запретит мне воспользоваться std::views::elements и мне зачем-то придётся использовать std::views::transform.
Допустим даже, что я решил написать свой тип Pair, который полностью повторяет интерфейс std::pair. Более того, я его просто скопипастил из STL, но поместил в namespace my_std. Теперь он тоже не удовлетворяет концепту и я не могу его использовать в том же elements_view.
Это неудобство использования выглядит неконсистентным и с другой частью языка – structured bindings, которые умеют то, чего не умеет elements_view.
Альтернативный путь
Возможно, стоит сосредоточиться именно на допиливании std::views::elements, чтобы он умел прожёвывать кастомные типы. Я не могу знать всех глубинных причин такого дизайна, поэтому готов развивать данное предложение в наиболее комитето-принимабельном виде.
https://en.cppreference.com/w/cpp/utility/tuple/tuple-like https://en.cppreference.com/w/cpp/ranges/elements_view.html