调用参数多于参数的函数/函子

xyl*_*per 4 c++ lambda templates function c++14

我想编写一个模板函数,它可以调用具有给定参数的函数。

例如,我可以编写一个简单的调用函数:

template<class F, class... Args>
inline auto invoke(F &&func, Args&&... args) -> decltype(auto)
{
    return std::forward<F>(func)(std::forward<Args>(args)...);
}
Run Code Online (Sandbox Code Playgroud)

invoke接受与所需相同数量的参数f。但是,我希望此模板函数允许其他未使用的参数。也就是说,我想编写一些代码,例如:

auto f = [] (auto a) {...};
invoke(f, 1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

这里,f仅接受一个参数,因此,我希望invoke忽略除第一个参数之外的其他参数。这可以通过获取 lambda 的数量来轻松完成,除非 lambda 是通用的。

由于f这是通用的 lambda,据我所知,没有通用的方法可以在f没有显式实例化其 的情况下计算出 的 arity template operator()<...>

我该如何写我的invoke

Pio*_*cki 6

一种可能性:

#include <utility>
#include <cstddef>
#include <tuple>

template <std::size_t... Is, typename F, typename Tuple>
auto invoke_impl(int, std::index_sequence<Is...>, F&& func, Tuple&& args)
    -> decltype(std::forward<F>(func)(std::get<Is>(std::forward<Tuple>(args))...))
{
    return std::forward<F>(func)(std::get<Is>(std::forward<Tuple>(args))...);
}

template <std::size_t... Is, typename F, typename Tuple>
decltype(auto) invoke_impl(char, std::index_sequence<Is...>, F&& func, Tuple&& args)
{
    return invoke_impl(0
                     , std::index_sequence<Is..., sizeof...(Is)>{}
                     , std::forward<F>(func)
                     , std::forward<Tuple>(args));
}

template <typename F, typename... Args>
decltype(auto) invoke(F&& func, Args&&... args)
{
    return invoke_impl(0
                     , std::index_sequence<>{}
                     , std::forward<F>(func)
                     , std::forward_as_tuple(std::forward<Args>(args)...));
}
Run Code Online (Sandbox Code Playgroud)

演示版