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

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

本文关键字:参数 函数 指针 转换 包转换      更新时间:2023-10-16

我想实现以下内容:

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之类的东西。但是 - 也许我错了,这比我想象的要简单。

注意:

  • 我通过指针到const的元组的解决方案是可以接受的,尽管它是最佳的 - 因为我无法将__restrict__应用于他们(因为它不是真正的C ,我知道我知道)。实际上,它本身甚至很有趣,因为我可能能够用元组执行其他技巧。
  • 我不介意函子服用单个指针,而不是多个单独的指针。
  • 我正在使用NVCC GCC 5.4.1;该代码应为c 11'ish(即我可以作为CUDA代码编译的C 11的一部分)。
  • 我将结果流到 std::cout只是为了不给任何人,我的想法我没有用函数的返回值做任何事情,这似乎是示例代码中最直接的事情。
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';
  }
}

好吧,这很容易。

实时示例。