在 C++14 中,您将能够执行以下操作,与您最初的尝试非常相似:
template<typename... Ns, size_t... Is>
void ForwardToFuncIncreasedImpl(Ns... nums, std::index_sequence<Is...>)
{
Func( (nums + std::get<Is>(summands_))... );
}
template<typename... Ns>
void ForwardToFuncIncreased(Ns... nums)
{
ForwardToFuncIncreasedImpl(nums..., std::index_sequence_for<Ns...>());
}
与此同时,您可以找到或编写自己的 index_sequence 实现。
或者做这样的事情:首先做std::make_tuple(ints...),这样我们就有两个要求和的元组(或者一个元组和一个std::array)。然后使用 Andrei Alexandrescu 在The Way of the Exploding Tuple 中演示的模式将总和扩展为传递给Func 的参数包。
template <int N>
struct Pairwise;
template <>
struct Pairwise<0>
{
template <typename F, typename T, typename U, typename... Args>
static void Sum(F f, T const&, U const&, Args... sums)
{
f(sums...);
}
};
template <int N>
struct Pairwise
{
template <typename F, typename T, typename U, typename... Args>
static void Sum(F f, T const& a, U const& b, Args... sums)
{
Pairwise<N - 1>::Sum(f, a, b, std::get<N - 1>(a) + std::get<N - 1>(b), sums...);
}
};
template <typename... Ns>
void ForwardToFuncIncreased(Ns... nums)
{
Pairwise<sizeof...(Ns)>::Sum(Func, std::make_tuple(nums...), summands_);
}
也可以不用初始make_tuple:
template <typename... Ns>
struct Pairwise;
template <>
struct Pairwise<>
{
template <typename F, typename T, typename... Args>
static void Sum(F f, T const&, Args... sums)
{
f(sums...);
}
};
template <typename N0, typename... Ns>
struct Pairwise<N0, Ns...>
{
template <typename F, typename T, typename... Args>
static void Sum(F f, N0 num0, Ns... nums, T const& a, Args&&... sums)
{
Pairwise<Ns...>::Sum(f, nums..., a, sums..., num0 + std::get<sizeof...(Args)>(a));
}
};
template <typename... Ns>
void ForwardToFuncIncreased(Ns... nums)
{
Pairwise<Ns...>::Sum(Func, nums..., summands_);
}