Open apolukhin opened 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.
Предлагают реализовать данную функциональность на уровне языка в 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;
};
Перенос предложения: голоса +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, ...).