YiFei
YiFei

Reputation: 1856

Call a function with parameter from a pack of functors in variadic template

I had a (lambda) function and a lot of functors passed as variadic argument pack into a third function. The signature looks like

template<typename F, typename... G>
ret_t call(F&& func, G&&... getters);

and F shall have as many as argument as the number of getters given.

Now I need to call func with the return value of getter called against a hard-coded (constexpr) constant determined otherwise. So untemplated code might look like

{
    return func(getters_1(0), getters_2(0), getters_3(0) /* , ... */);
}

Of course I want to automate the process with template metaprogramming.


I want to avoid a temporary array or whatever intermediate container. (This is not aimed to that generic, I know the return type of getters.) I want it to be passed to the function as directly as possible so as to enable optimization and avoid waste of memory.

I could have wrapped F with many levels of closure of lambda, each wraps one parameter to it, and hope the best from compiler, but anyways I'm asking for better and clearer ways to do it.

Upvotes: 0

Views: 221

Answers (1)

Rakete1111
Rakete1111

Reputation: 48998

If I understood you correctly you want something like this:

template<typename F, typename... G>
ret_t call(F&& func, G&&... getters) {
    return std::forward<F>(func)(std::forward<G>(getters)(0)...);
}

Upvotes: 4

Related Questions