#pragma once template struct Tensor { static constexpr USize element_size = (S*...); template using EnableArgs = std::enable_if_t; template using EnableArgsPerElement = std::enable_if_t; using Enable = std::enable_if_t; template Tensor() : elements{} {} template explicit Tensor(T scalar) { std::fill(elements, elements + element_size, scalar); } template = true> Tensor(Args... args) : elements{ static_cast(args)... } {} template = true> auto& operator()(Args... args) { return elements[pos(args...)]; } template = true> static constexpr USize pos(Args... args) { USize positions[O] = {static_cast(args)...}; USize dimensions[O] = {S...}; USize p = 0; for (Int i = 0; i < O; i++) { p *= dimensions[i]; p += positions[i]; } return p; } T elements[element_size]; };