но я не знаю, сколько аргументов F нужно

йте, что у меня есть следующее:

void bar(int a, int b)
{
}   

template<typename F, typename... Args>
void foo(F function, Args... args>
{
    function(args...);
}

Я хотел бы иметь какой-то способ передать только необходимое количество аргументов функции, чтобы я мог сделать следующее, что должно привести к вызову bar с аргументами 1, 2, отбрасывающими 3. Не зная, сколько аргументов необходимо передать в тип функции F.

foo(bar, 1, 2, 3);
foo([](int a, int b){}, 1, 2, 3);

Когда я пытаюсь использовать следующие черты функции:

namespace detail
{
    template<typename F, std::size_t... Is, class Tup>
    void call_discard_impl(F&& func, std::index_sequence<Is...>, Tup&& tup) 
    {
        std::forward<F>(func)(std::get<Is>(tup)...);
    }
}

template<typename F, typename... Args>
void call_discard(F&& func, Args&&... args)
{
    detail::call_discard_impl(std::forward<F>(func),
        std::make_index_sequence<function_traits<F>::num_args>{},
        std::forward_as_tuple(args...));
}

Я получил:

error C2510: 'F': left of '::' must be a class/struct/union
error C2065: '()': undeclared identifier
error C2955: 'function_traits': use of class template requires template argument list

На:

template <typename F>
struct function_traits : public function_traits<decltype(&F::operator())>
{}

Я получил рабочую версию функции-члена, которая не требовала черты функции:

namespace detail
{
    template<typename O, typename R, typename... FunArgs, std::size_t... Is, class Tup>
    void call_discard_impl(O* obj, R(O::*mem_func)(FunArgs...), std::index_sequence<Is...>, Tup&& tup)
    {
        ((*obj).*mem_func)(std::get<Is>(tup)...);
    }
}

template<typename O, typename R, typename... FunArgs, typename... Args>
void call_discard(O* obj, R(O::*mem_func)(FunArgs...), Args&&... args)
{
    detail::call_discard_impl(obj, mem_func,
        std::make_index_sequence<sizeof...(FunArgs)>{},
        std::forward_as_tuple(args...));
}

Ответы на вопрос(3)

Ваш ответ на вопрос