如何将模板参数包转换为函数的多个指针参数?
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 这样的东西,我才刚刚开始研究这些东西;但是 - 也许我错了,它比我想象的要简单。
注:
- 我传递一个指向常量指针的元组的解决方案是可以接受的,尽管它不是最优的——因为我不能对它们应用
__restrict__
(因为它不是真正的 C++,我知道我知道)。实际上,它本身甚至很有趣,因为我可以用元组执行其他技巧。
- 我也不介意函子采用单个指针元组而不是多个单独的指针。
- 我正在使用 nvcc + GCC 5.4.1;代码应该是 C++11'ish(也就是说,我可以编译为 CUDA 代码的 C++11 部分)。
- 我将结果流式传输到
std::cout
只是为了不让任何人认为我没有对仿函数的 return 值做任何事情,这似乎是最直接的事情示例代码。
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';
}
}
嗯,这很简单。
我想执行以下操作:
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'ish(也就是说,我可以编译为 CUDA 代码的 C++11 部分)。
- 我将结果流式传输到
std::cout
只是为了不让任何人认为我没有对仿函数的 return 值做任何事情,这似乎是最直接的事情示例代码。
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';
}
}
嗯,这很简单。