Skip to content

Latest commit

 

History

History
91 lines (68 loc) · 1.79 KB

319.md

File metadata and controls

91 lines (68 loc) · 1.79 KB
Info

Example

consteval auto foo(const auto (&value)[1]) { return value[0]; }
static_assert(42 == foo({42}));

https://godbolt.org/z/hnPM17fK7

Puzzle

Can you implement sum_n which sums given list of parameters?

// TODO sum_n

static_assert(1==sum_n({1}));
static_assert(1+2==sum_n({1}, {2}));
static_assert(1+2+3+4==sum_n({1, 2}, {3, 4}));

https://godbolt.org/z/YPfExbzjz

Solutions

consteval auto sum_n(const auto ...x)
{
    return (x + ...);
}

consteval auto sum_n(const auto (&... x)[1])
{
    return sum_n(x[0]...);
}

consteval auto sum_n(const auto (&... x)[2])
{
    return sum_n(x[1]...) + sum_n(x[0]...);
}

https://godbolt.org/z/1fxxz6KEv

template <typename... Ts, int... Ns>
consteval auto sum_n(const Ts (&...x)[Ns]) {
    return (... + std::ranges::fold_left(x, Ts{}, std::plus{}));
}

https://godbolt.org/z/bKdz3EEr1

template <auto... Ns>
constexpr auto sum_n(auto (&&...values)[Ns]) {
  auto sum = 0;
  return ([&] {
    for (auto value : values) {
      sum += value;
    }
  }(), ..., sum);
}

https://godbolt.org/z/x7jn47Geb

template<auto N>
consteval auto sum_n(const auto  (&...array)[N]) {
    auto result = (std::accumulate(array, array + N, 0) + ...);
    return result;
}

https://godbolt.org/z/rGG7KM7qa

template<class... Lists, int ...N>
consteval auto sum_n(const Lists (&...v)[N]) {
    return (std::accumulate(v, v+N, 0) + ...);
}

https://godbolt.org/z/9hYTe14ds