Добавить runtime функцию для создания std::variant с типом внутри определяемым по индексу
ExpertSDR3 opened this issue · 0 comments
ExpertSDR3 commented
Мне нужно было реализовать 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: