std::type_pack_element

Andrey Davydov
Andrey Davydov

При работе с variadic templates часто бывает полезно получить i-й элемент из pack'а (к примеру, в реалзизации std::get<size_t> для 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, ...).

9
рейтинг
5 комментариев
yndx-antoshkka

Это будет очень полезная штука!

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

yndx-antoshkka
Andrey Davydov

yndx-antoshkka, можете привести пример, когда type_pack_element может использоваться неправильно?

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

 

Andrey Davydov
yndx-antoshkka

Andrey Davydov, что-то затрудняюсь придумать. Наверное и правда всё ок

yndx-antoshkka
Andrey Davydov

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

Andrey Davydov
yndx-antoshkka

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

yndx-antoshkka
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения