std::extentdefined for inline arrays. std::arrayUse instead std::tuple_size. I don't know some trait that works on both, but it's easy to write:
template<typename T>
struct array_size : std::extent<T> { };
template<typename T, size_t N>
struct array_size<std::array<T,N> > : std::tuple_size<std::array<T,N> > { };
and here is your fooadjusted / generalized ( live example ):
template < typename T >
void foo( T&& param )
{
using U = typename std::remove_cv<typename std::remove_reference<T>::type>::type;
static_assert( 3 == array_size<U>::value, "param must have a size of 3" );
}
T&& param, lvalues.