gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:53:26 24 4
gpt4 key购买 nike

我想实现以下内容:

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 这样的东西,我才刚刚开始研究这些东西;但是 - 也许我错了,它比我想象的要简单。

注意:

  • 我传递一个指向常量指针的元组的解决方案是可以接受的,尽管它不是最优的——因为我不能对它们应用 __restrict__(因为它不是真正的 C++,我知道我知道)。实际上,它本身甚至很有趣,因为我可以用元组执行其他技巧。
  • 我也不介意仿函数采用单个指针元组而不是多个单独的指针。
  • 我正在使用 nvcc + GCC 5.4.1;代码应该是 C++11 风格的(也就是说,我可以编译为 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';
}
}

好吧,这很简单。

Live example .

关于c++ - 如何将模板参数包转换为函数的多个指针参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42680826/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com