cpp-ru / ideas

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

Добавить std::variant_index по аналогии с std::variant_alternative #388

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +5, -0 Автор идеи: Олег Фатхиев

Сейчас для std::variant можно узнать тип из его вариадичного списка по его индексу в нём, но нельзя сделать обратную операцию: узнать индекс типа.

Предлагается добавить функцию std::variant_index/std::variant_index_v

Она могла бы выглядеть как-то так:

template <class T, class V>
struct variant_index;

template <class T, class... Ts>
struct variant_index<T, std::variant<Ts...>>
    : integral_contant<size_t, index_of<T, Ts..>::value>;

template <class T, class V>
constexpr size_t variant_index_v = variant_index<T, V>::value;

Где index_of - некая метафункция, возвращающая индекс типа T в списке типов std::variant.

Нужно также определить поведение этой функции:

Если T не содержится в Ts... (или T содержится в Ts... больше 1 раза), то поведение не определено.

Включать ли пункт про наличие T в Ts... больше одного раза - непонятно, это нужно обсудить.

apolukhin commented 3 years ago

yndx-antoshkka, 11 декабря 2018, 12:20 Отличная идея. Для симметрии, стоит добавить аналогичный функционал для std::tuple

Andrey Davydov, 11 декабря 2018, 15:34 А Вы можете показать пример использования variant_index? Я совершенно не против Вашей идеи, просто хотелось бы увидеть пару конкретных примеров.