Я пытался написать свою первую программу, используя вариативные шаблоны. В частности, аргументы упаковки для вызова функции с задержкой. Мое первоначальное предположение о вызове указателя функции, как показано ниже, не работает:Я хотел бы понять, что распаковка параметров в C++
template<typename... params>
void TypeX<params...>::delayed_call()
{
auto xs = get_saved_args(); // returns tuple
(*func)(xs...);
}
После поисков я нашел этот ответ C++11: I can go from multiple args to tuple, but can I go from tuple to multiple args?
Ответ пользователем Kerrek SB работал, и выглядит лучше, чем другие альтернативы. К сожалению, я понимаю это лишь частично. Это его ответ:
// implementation details, users never invoke these directly
namespace detail
{
template <typename F, typename Tuple, bool Done, int Total, int... N>
struct call_impl
{
static void call(F f, Tuple && t)
{
call_impl<F, Tuple, Total == 1 + sizeof...(N), Total, N..., sizeof...(N)>::call(f, std::forward<Tuple>(t));
}
};
template <typename F, typename Tuple, int Total, int... N>
struct call_impl<F, Tuple, true, Total, N...>
{
static void call(F f, Tuple && t)
{
f(std::get<N>(std::forward<Tuple>(t))...);
}
};
}
// user invokes this
template <typename F, typename Tuple>
void call(F f, Tuple && t)
{
typedef typename std::decay<Tuple>::type ttype;
detail::call_impl<F, Tuple, 0 == std::tuple_size<ttype>::value, std::tuple_size<ttype>::value>::call(f, std::forward<Tuple>(t));
}
Я понимаю, что это рекурсивное решение, которое заканчивается после того, как частично специализированная версия будет достигнута. Однако я не могу понять поток, и как именно f(std::get<N>(std::forward<Tuple>(t))...);
превращается в распакованный вызов. В идеале я хотел бы увидеть подробное описание потока полностью от вызываемого пользователем вызова функции.
Пропуски в 'F (станд :: получить (Std :: вперед (т)) ...);' это пакет расширения. Когда N является пакетом параметров, скажем, «0,1,2», тогда строка будет расширена компилятором до 'f (std :: get <0> (std: forward (t), std :: get <1> (std :: вперед (t), std :: get <2> (std: forward (t)); ' –
jrok