#include <iostream>
using namespace std;
template<class T>
struct my_rank{
static constexpr unsigned value = 0;
};
template<class T, unsigned I>
struct my_rank<T[I]>{
static constexpr unsigned value = my_rank<T>::value + 1;
};
int main() {
int a3[3][3][3];
int a2[3][3];
int a7[3][3][3][3][3][3][3];
std::cout << my_rank<decltype(a3)>::value << std::endl;//3
std::cout << my_rank<decltype(a2)>::value << std::endl;//2
std::cout << my_rank<decltype(a7)>::value << std::endl;//7
std::cout << my_rank<decltype(a3[0][0][0])>::value << std::endl;//0
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8Y2xhc3MgVD4Kc3RydWN0IG15X3Jhbmt7CglzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIHZhbHVlID0gMDsKfTsKdGVtcGxhdGU8Y2xhc3MgVCwgdW5zaWduZWQgST4Kc3RydWN0IG15X3Jhbms8VFtJXT57CglzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIHZhbHVlID0gbXlfcmFuazxUPjo6dmFsdWUgKyAxOwkKfTsKCmludCBtYWluKCkgewoJaW50IGEzWzNdWzNdWzNdOwoJaW50IGEyWzNdWzNdOwoJaW50IGE3WzNdWzNdWzNdWzNdWzNdWzNdWzNdOwoJc3RkOjpjb3V0IDw8IG15X3Jhbms8ZGVjbHR5cGUoYTMpPjo6dmFsdWUgPDwgc3RkOjplbmRsOy8vMwoJc3RkOjpjb3V0IDw8IG15X3Jhbms8ZGVjbHR5cGUoYTIpPjo6dmFsdWUgPDwgc3RkOjplbmRsOy8vMgoJc3RkOjpjb3V0IDw8IG15X3Jhbms8ZGVjbHR5cGUoYTcpPjo6dmFsdWUgPDwgc3RkOjplbmRsOy8vNwoJc3RkOjpjb3V0IDw8IG15X3Jhbms8ZGVjbHR5cGUoYTNbMF1bMF1bMF0pPjo6dmFsdWUgPDwgc3RkOjplbmRsOy8vMAoJcmV0dXJuIDA7Cn0=