Например, есть что-то такое.
constexpr int n{4};
int shape[n];
for (int j0=0; j0<shape[0]; ++j0) {
for (int j1=0; j1<shape[1]; ++j1) {
for (int j2=0; j2<shape[2]; ++j2) {
for (int j3=0; j3<shape[3]; ++j3) {
/* return iterator to do external stuff ? */
}
}
}
}
template<n>flatten (int *shape, ...) -> iterator
int shape[4];
for (auto entry : flatten<4>(shape)) {
/* do external stuff */
}