Преобразование кортежа в варианты задачC++

Программы на C++. Форум разработчиков
Anonymous
Преобразование кортежа в варианты задач

Сообщение Anonymous »

Мне нужно получить доступ к значению в std::tuple по индексу во время выполнения. Для этой цели я написал функцию, которая возвращает std::variant с теми же типами, которые инициализированы для указанного индекса. Реализация включает рекурсивное создание экземпляров шаблона:

Код: Выделить всё

template
constexpr auto get_n = [](/*tuple-like*/auto&& t, std::size_t index)
{
using variant_type = decltype(std::apply([](auto&&... v){
return std::variant{};
}, t));

constexpr auto size = std::tuple_size_v;

if constexpr(N > size)
return variant_type{};
else
{
if(N == index + 1)
return variant_type(std::in_place_index, std::get(t));
else
return get_n(t, index);
}
};

constexpr auto tuple_to_variant(/*tuple-like*/auto&& t, std::size_t index)
{
return get_n(std::forward(t), index);
}
Я использую компиляторы C++23. Проблема в том, что без ошибок компилируется только gcc. Компиляторы clang и MSVC переходят в бесконечный цикл создания экземпляров. Это ошибка в компиляторах? Как я могу исправить этот код, который компилируется во всех трех компиляторах?
Вот демо-версия Compiler Explorer

Подробнее здесь: https://stackoverflow.com/questions/787 ... t-problems

Вернуться в «C++»