cpp-ru / ideas

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

Добавить runtime функцию для создания std::variant с типом внутри определяемым по индексу #556

Open ExpertSDR3 opened 1 year ago

ExpertSDR3 commented 1 year ago

Мне нужно было реализовать FSM на шаблонах, описывается таблица переходом, из неё извлекаются все типы состояний и для хранения текущего состояния я взял std::veriant, он идеально подходит для этого. Во время выполнения состояния могут переключаться по разному и нужно было реализовать функцию, которая создаёт std::variant с конкретным типом внутри и этот тип определяется индексом. В STL есть compiletime решение: std::variant(std::in_place_index<I>) , но мне нужен был аналог для runtime.

Благодаря сообществу нашлось решение:

template <class... T, std::size_t... I>
constexpr static std::variant<T...> make_one_impl(std::index_sequence<I...>, std::size_t i) {
    return std::array { +[] { return std::variant<T...>(std::in_place_index<I>); }... }[i]();
}

template <class... T>
constexpr static std::variant<T...> make_one(std::size_t index) {
    return make_one_impl(std::index_sequence_for<T...>(), index);
}

Написать такое под силу не многим, хотелось бы иметь готовые решения в STL.

Моя библиотека FSM: