如何将模板参数包转换为函数的多个指针参数?

How do I convert a template parameter pack into multiple pointer arguments to a function?

我想执行以下操作:

template <typename Functor, typename... Params>
void foo(
    size_t n
    /* magic goes here, producing function parameters p1, p2, etc. */
    /* corresponding to the parameter pack.                        */
)
{
    for(size_t i = 0; i < n; i ++) {
        std::cout << Functor()( 
            /* pass p1[i], p2[i], etc. corresponding to the  */
            /* parameter pack.                               */
        )  << '\n';
    }
}

因此 foo 会扩展成如下内容:

void foo(
    size_t n,
    const int* __restrict__ p1,
    const int* __restrict__ p2
)
{
    for(size_t i = 0; i < n; i ++) {
        std::cout << std::plus()(p1[i], p2[i]) << '\n';
    }
}

我有一个模糊的直觉,我可能需要超越标准库,进入像 Fusion、Brigand 或 Hana 这样的东西,我才刚刚开始研究这些东西;但是 - 也许我错了,它比我想象的要简单。

注:

template<class Functor, class...Ts>
void foo( std::size_t n,
  Ts const* __restrict__ ... ts
) {
  for(size_t i = 0; i < n; i ++) {
    std::cout << Functor{}( ts[i]...)  << '\n';
  }
}

嗯,这很简单。

Live example.