Есть хороший небольшой трюк, который вы можете сделать с равномерным синтаксисом инициализации, доступным на C ++ 11. Вместо того, чтобы напрямую принимать индекс, вы берете POD.
struct indices
{
std::size_t i, j, k;
};
T& operator[](indices idx)
{
return m_cells[idx.k * m_resSqr + idx.j * m_res + idx.i];
}
И затем используйте новый синтаксис:
my_array<int> arr;
// ...
arr[{1, 2, 3}] = 42;