#include <iostream>
#include <array>
#include <numeric>
#include <cmath>

template <typename T, unsigned S>
struct vec {
  T v[S];

  T const* begin() const { return v; }
  T const* end()   const { return v+S; }

  auto length() const-> decltype(std::sqrt(std::declval<T>()))
  {
    auto square = [](T const& a, T const& b){return a+b*b;};
    T sum_of_squares = std::accumulate(begin(), end(), T{}, square);
    return std::sqrt(sum_of_squares);
  }
};

int main()
{
  vec<int, 3> v = {{2,1,2}};
  std::cout << v.length() << '\n';

  vec<int, 2> v2 = {{6,8}};
  std::cout << v2.length() << '\n';
}
