w C++ 17, można używać krotnie wyrażeń:
template<typename ...Ts>
int sum_impl(Ts&& ...a)
{
return (a + ...);
}
Jeśli sum_impl
miał stałą liczbę parametrów, możemy nazwali go tak:
std::apply(sum_impl, arr);
przy założeniu, że arr jest std::array<int, N>
. Ale ponieważ jest to o zmiennej liczbie argumentów, potrzebuje trochę pchania i pomocników:
using namespace std;
template <class Array, size_t... I>
int sum_impl(Array&& a, index_sequence<I...>)
{
return sum_impl(get<I>(forward<Array>(a))...);
}
template <class Array>
int sum(Array&& a)
{
return sum_impl(forward<Array>(a),
make_index_sequence<tuple_size_v<decay_t<Array>>>{});
}
Dlatego zakładając te pomocników są na swoim miejscu, kod będzie wyglądać następująco:
template<typename ...Ts>
int sum_impl(Ts&& ...a)
{
return (a + ...);
}
int main()
{
array<int, 10> arr{0,1,2,3,4,5,6,7,8,9};
cout << sum(arr) << "\n";
return 0;
}
'std :: accumulate' robi tylko to, co jest napisane na puszce, co jest jednym z powodów, aby używać go na pętli. – chris
Dla wektorów: http://stackoverflow.com/questions/3221812/sum-of-elements-in-a-stdvector –