Есть ли переносимый способ создания std::tuple
(действительно std::array
) из содержимого контейнера? Такой кортеж позволял бы std::apply
извлекать аргументы функции из контейнера.Сгенерировать std :: tuple из стандартного контейнера
Моя первая попытка, использующая хвостовую рекурсию, терпит неудачу с ошибкой компилятора: «Рекурсивный экземпляр шаблона превышает максимальный ...».
Я не мог получить вторую попытку (std::for_each
с изменяемым лямбда-кортежем) для компиляции с желаемыми результатами.
Я предполагаю, что что-то похожее на то, как boost::mpl
обрабатывает вариационные метафайлы (например, магию с использованием boost::preprocessor
), можно заставить работать, но это так C++ 03. Я надеюсь, что есть лучшее решение.
Функция подписи будет выглядеть примерно так:
std::list<int> args_as_list = {1, 2, 3, 4};
auto tpl = args_as_tuple(args_as_list);
где тип tpl
является std::array<int const, 4>
.
* станд :: кортеж (на самом деле станд :: массив) * Что вы имеете в виду под этим? std :: uple и std :: array - это * не * то же самое. – Borgleader
Tuple - это время компиляции, вы не можете сказать во время компиляции, сколько элева будет в списке. В любом случае вы можете использовать std :: llist :: value_type –
Melkon
«std :: array» поддерживает интерфейс 'std :: tuple'. Очевидно, что все элементы в контейнере являются одним и тем же типом 'container :: value_type'. Так что истинный кортеж, или 'std :: array' оба хороши. – KentH