我想实现以下内容:
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 ++,我知道我知道)。实际上它本身甚至有趣,因为我可以用元组执行其他技巧。std::cout
,只是为了不让任何人知道我没有使用仿函数的返回值做任何事情,这似乎是示例代码中最直接的事情。答案 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';
}
}
好吧,这很容易。