//#(compile) c++; compiler:g132; options:-O3 -std=c++23; libs:-
// https://godbolt.org/z/nqbKT9GEa
#include <array>
#include <numeric> // accumulate
#include <iostream>
template<size_t SZ>
int sumSz(const std::array<int,SZ>& data) {
int result = 0;
for(auto i=0uz; i<SZ; ++i) // uz ist das Suffix für size_t seit C++23
result += data[i];
return result;
}
template<typename Elem, size_t SZ>
Elem sumElem(const std::array<Elem,SZ>& data) {
Elem result {0};
for(auto i=0uz; i<SZ; ++i)
result += data[i];
return result;
}
// C++20-Concept input_iterator, sonst typename
template<std::input_iterator It>
int sumIt(It begin, It end) {
return std::accumulate(begin, end, 0);
}
int sumAuto(std::input_iterator auto begin, std::input_iterator auto end) {
return std::accumulate(begin, end, 0);
}
// abgekürztes funktionstemplate mit auto
int main() {
using namespace std;
array<int,4> a4 { 1, 2, 5, 8 };
cout << sumSz<4>(a4) << '\n'; // Ausgabe: 16
array<int,5> a5 { 1, -5, 3, 7, 2 };
cout << sumElem(a5) << '\n'; // Ausgabe: 8
array<int,6> a6 { 1,2,3, 4,5,6 };
cout << sumIt(a6.begin(), a6.end()) << '\n'; // Ausgabe: 21
array a7 { 1,2,3, 4,5,6, 7 }; // array<int,7>
cout << sumIt(a7.begin(), a7.end()) << '\n'; // Ausgabe: 28
cout << sumAuto(a7.begin(), a7.end()) << '\n'; // Ausgabe: 28
}