#include <string>
#include <iostream>
#include <iterator>
#include <type_traits>
template < typename T, std::size_t N >
constexpr std::size_t size( T(&)[N] ) { return N ; }
int main()
{
const std::string first[] = { "a", "be", "see" } ;
std::cout << "array 'first' size: " << size(first) << ' ' ;
// std::end() overload for arrays uses the same technique
std::cout << std::end(first) - std::begin(first) << ' ' ;
// more of the same
std::cout << std::extent< decltype(first) >::value << '\n' ;
const int second[][6] = { {0,1}, {2,3,4}, {5}, {6,7,8,9}, {} } ;
using array_type = decltype(second) ;
std::cout << "array 'second' rank: " << std::rank<array_type>::value << ", "
<< "nrows: " << std::extent<array_type>::value << ", "
<< "ncols: " << std::extent<array_type,1>::value << '\n' ;
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KCnRlbXBsYXRlIDwgdHlwZW5hbWUgVCwgc3RkOjpzaXplX3QgTiA+CmNvbnN0ZXhwciBzdGQ6OnNpemVfdCBzaXplKCBUKCYpW05dICkgeyByZXR1cm4gTiA7IH0KCmludCBtYWluKCkKewogICAgY29uc3Qgc3RkOjpzdHJpbmcgZmlyc3RbXSA9IHsgImEiLCAiYmUiLCAic2VlIiB9IDsKCiAgICBzdGQ6OmNvdXQgPDwgImFycmF5ICdmaXJzdCcgc2l6ZTogIiA8PCBzaXplKGZpcnN0KSA8PCAnICcgOwoKICAgIC8vIHN0ZDo6ZW5kKCkgb3ZlcmxvYWQgZm9yIGFycmF5cyB1c2VzIHRoZSBzYW1lIHRlY2huaXF1ZQogICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kKGZpcnN0KSAtIHN0ZDo6YmVnaW4oZmlyc3QpIDw8ICcgJyA7CgogICAgLy8gbW9yZSBvZiB0aGUgc2FtZQogICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZXh0ZW50PCBkZWNsdHlwZShmaXJzdCkgPjo6dmFsdWUgPDwgJ1xuJyA7CgoKICAgIGNvbnN0IGludCBzZWNvbmRbXVs2XSA9IHsgezAsMX0sIHsyLDMsNH0sIHs1fSwgezYsNyw4LDl9LCB7fSB9IDsKICAgIHVzaW5nIGFycmF5X3R5cGUgPSBkZWNsdHlwZShzZWNvbmQpIDsKCiAgICBzdGQ6OmNvdXQgPDwgImFycmF5ICdzZWNvbmQnIHJhbms6ICIgPDwgc3RkOjpyYW5rPGFycmF5X3R5cGU+Ojp2YWx1ZSA8PCAiLCAiCiAgICAgICAgICAgICAgIDw8ICJucm93czogIiA8PCBzdGQ6OmV4dGVudDxhcnJheV90eXBlPjo6dmFsdWUgPDwgIiwgIgogICAgICAgICAgICAgICA8PCAibmNvbHM6ICIgPDwgc3RkOjpleHRlbnQ8YXJyYXlfdHlwZSwxPjo6dmFsdWUgPDwgJ1xuJyA7Cn0K