Как я могу нарезать параметры шаблона и использовать их? - PullRequest
0 голосов
/ 19 сентября 2019

Я довольно новичок в шаблонном метапрограммировании.Это то, что я хотел сделать.

template <typename... Args>
void to_be_async_func(Args&&... args)
{
   //want to use args[0...N-2] to invoke a function call
   //and args[N-1(last)] to use a handler function after the prior call.
}

int main()
{
    int a = 5;
    int b = 3;
    to_be_async_func(a, b, [](int res)
    {
       //do something with the result
       //any Callable can be passed
    });
}

Изначально я пытался сделать так, как

template<typename... Args, typename Callable>
void to_be_async_func(Args&&... args, Callable op)
{

}

Однако в этом случае «Callable» должен иметь значение по умолчанию, которое будет использоваться таким образом.
На мой взгляд, какая-то вспомогательная структура шаблона могла бы сделать это.
Если это возможно, не могли бы вы показать мне путь?
Заранее спасибо.

РЕДАКТИРОВАТЬ
Я также видел этот пост и пробовал в соответствии с инструкциями.
Это сработало.Но, как указано в тексте, я хочу знать, есть ли более стандартный способ достижения этого.

1 Ответ

0 голосов
/ 19 сентября 2019

Использование std::index_sequence кажется правильным путем:

template <typename F, typename... Args>
void to_be_async_func_first(F&& f, Args&&... args)
{
    std::invoke(std::forward<F>(f), std::forward<Args>(args)...);
}

template <std::size_t ... Is, typename... Args>
void to_be_async_func_impl(std::index_sequence<Is...>, Args&&... args)
{
    auto&& args_tuple = std::forward_as_tuple(std::forward<Args>(args)...);
    to_be_async_func_first(std::get<sizeof...(Args) - 1>(args_tuple),
                           std::get<Is>(args_tuple)...);
}

template <typename... Args>
void to_be_async_func(Args&&... args)
{
    to_be_async_func_impl(std::make_index_sequence<sizeof...(Args) - 1>(),
                          std::forward<Args>(args)...);
}
...