cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

std::type_pack_element #366

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +9, -0 Автор идеи: Andrey Davydov

При работе с variadic templates часто бывает полезно получить i-й элемент из pack'а (к примеру, в реалзизации std::get для tuple и variant). Соответственно, предлагается добавить в стандартную библиотеку template type alias type_pack_element с сигнатурой <std::size_t I, typename ...Ts> using type_pack_element = ..., который может быть реализован, как уже имеющимися языковыми средствами, что однако требует определенного числа инстанциаций шаблонов, так и, аналогично std::make_integer_sequence, через compiler intrinsic. В Clang'е уже есть __type_pack_element, поддержать в остальных компиляторах должно быть не сложно, и главное, практически бесплатно с точки зрения времени компиляции: variadic pack хранится в массиво-подобной структуре, и обратиться к элементу под индексу операция очень дешевая (в сравнении с инстанциацией шаблонов, overload resolution, ...).

apolukhin commented 3 years ago

yndx-antoshkka, 11 октября 2018, 19:33 Это будет очень полезная штука!

Меня пугает только то, что пользователи могут начать везде использовать этот механизм, даже там, где надо применять integer_sequence.

Andrey Davydov, 11 октября 2018, 22:11 yndx-antoshkka, можете привести пример, когда type_pack_element может использоваться неправильно?

Написал в std-proposals https://groups.google.com/a/isocpp.org/d/msg/std-proposals/HRx31Xhg7CU/mP5f6pTABAAJ посмотрю, что там скажут.

yndx-antoshkka, 12 октября 2018, 13:39 Andrey Davydov, что-то затрудняюсь придумать. Наверное и правда всё ок

Andrey Davydov, 8 ноября 2018, 21:47 yndx-antoshkka, обсуждение в std-proposals естественным образом затухло, так что можно приступать к написанию бумаги, однако меня немного смущает позиция Louis Dionne. Как Вам кажется, достаточно ли высока вероятность, что предложение будет отвергнуто с мотивацией "противоречит генеральной линии комитета в сторону value-based metaprogramming"?

yndx-antoshkka, 30 ноября 2018, 20:35 Andrey Davydov, всё просто: надо показать что std::type_pack_element полезен в случаях, когда value-based metaprogramming неудобен. Тоесть просто нужно несколько примеров того, что с value-based metaprogramming получается намного длиннее и некрасивее. Дополнительно стоит показать что std::type_pack_element можно имплементировать через value-based metaprogramming. Тогда если предложение не пройдёт по причине противоречия линии комитета, его просто надо будет перенаправить в подгруппу SG7 Reflections, чтобы уже они приняли его и выкатили в Reflections TS.

apolukhin commented 3 years ago

Предлагают реализовать данную функциональность на уровне языка в https://wg21.link/P1858

Можно будет просто использовать индексы:

    template <typename... Ts>
    class tuple {
    public:
        template <std::convertible_to<Ts...[0]> T,
                  std::convertible_to<Ts...[1]> U>
            requires sizeof...(Ts) == 2
        constexpr tuple(std::pair<T, U> const& p)
            : elems...[0](p.first)
            , elems...[1](p.second)
        { }
    private:
        Ts... elems;
    };