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

时间:2017-03-08 20:00:07

标签: c++ arrays variadic-templates functor template-meta-programming

我想实现以下内容:

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'(即C ++ 11中可以编译为CUDA代码的部分)。
  • 我将结果传递给std::cout,只是为了不让任何人知道我没有使用仿函数的返回值做任何事情,这似乎是示例代码中最直接的事情。

1 个答案:

答案 0 :(得分:4)

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