Вы можете попробовать с
unsigned l2 = Get<2>{}(7, 5, 16, 8);
Первая проблема в вашем коде заключается в том, что
Get<2>(l);
не является вызовом operator()
из Get<2>
;это конструкция Get<2>
объекта с параметром std::list
.
К сожалению, нет конструктора Get<2>
, который получает std::list
.
Вторая проблема в вашемкод состоит в том, что если вы вызываете operator()
из Get<2>
, как вы думаете
Get<2>{}(l)
, где l
является std::list
, вы передаете один аргумент;не вариативный список аргументов.И вы можете использовать список l
только во время выполнения, а не во время компиляции, как вам нужно.
К сожалению, способ Get<2>{}(7, 5, 16, 8)
(operator()
, который получает список переменных аргументов) несовместим спеременная, которая содержит список.
Я имею в виду ... вы не можете сделать что-то следующим образом
auto l = something{7, 5, 16, 8};
Get<2>{}(l);
Но, если вы измените operator()
, чтобы получить std::integer_sequence
какследует
template <template <typename X, X...> class C,
typename T, T I0, T ... Is>
constexpr auto operator() (C<T, I0, Is...> const &)
{
if constexpr (n > sizeof...(Is) )
return;
else if constexpr (n > 0)
return Get<n-1>{}(C<T, Is...>{});
else
return I0;
}
вы можете пройти через l
переменную следующим образом
auto l { std::integer_sequence<int, 7, 5, 16, 8>{} };
unsigned l2 = Get<2>{}(l);