从可变参数模板中的一组仿函数中调用带有参数的函数
Call a function with parameter from a pack of functors in variadic template
我有一个 (lambda) 函数,许多仿函数作为可变参数包传递给第三个函数。签名看起来像
template<typename F, typename... G>
ret_t call(F&& func, G&&... getters);
和 F
的参数应与给定的 getters
的数量一样多。
现在我需要使用 getter
的 return 值来调用 func
,该值是针对以其他方式确定的硬编码 (constexpr) 常量调用的。所以未模板化的代码可能看起来像
{
return func(getters_1(0), getters_2(0), getters_3(0) /* , ... */);
}
当然我想用模板元编程来自动化这个过程。
我想避免使用临时数组或任何中间容器。 (这不是针对那个通用的,我知道 return 类型的 getter。)我希望它尽可能直接传递给函数,以便启用优化并避免内存浪费。
我可以用许多级别的 lambda 闭包来包装 F,每个包装一个参数给它,并希望编译器能做到最好,但无论如何我都在寻求更好更清晰的方法。
如果我理解正确的话,你想要这样的东西:
template<typename F, typename... G>
ret_t call(F&& func, G&&... getters) {
return std::forward<F>(func)(std::forward<G>(getters)(0)...);
}
我有一个 (lambda) 函数,许多仿函数作为可变参数包传递给第三个函数。签名看起来像
template<typename F, typename... G>
ret_t call(F&& func, G&&... getters);
和 F
的参数应与给定的 getters
的数量一样多。
现在我需要使用 getter
的 return 值来调用 func
,该值是针对以其他方式确定的硬编码 (constexpr) 常量调用的。所以未模板化的代码可能看起来像
{
return func(getters_1(0), getters_2(0), getters_3(0) /* , ... */);
}
当然我想用模板元编程来自动化这个过程。
我想避免使用临时数组或任何中间容器。 (这不是针对那个通用的,我知道 return 类型的 getter。)我希望它尽可能直接传递给函数,以便启用优化并避免内存浪费。
我可以用许多级别的 lambda 闭包来包装 F,每个包装一个参数给它,并希望编译器能做到最好,但无论如何我都在寻求更好更清晰的方法。
如果我理解正确的话,你想要这样的东西:
template<typename F, typename... G>
ret_t call(F&& func, G&&... getters) {
return std::forward<F>(func)(std::forward<G>(getters)(0)...);
}