#include <iostream>

template < std::size_t POS > struct get_array_element
{
    template < typename T >
    auto operator() ( T&& t ) const -> decltype( *( std::forward<T>(t) ).array )
    { return std::forward<T>(t).array[POS] ; }
};

struct vertex { float array [5] ; } ;

constexpr auto x = get_array_element<0>() ;
constexpr auto y = get_array_element<1>() ;
constexpr auto z = get_array_element<2>() ;
constexpr auto u = get_array_element<3>() ;
constexpr auto v = get_array_element<4>() ;

int main ()
{
    vertex vert { { 1.2, 3.4, 5.6, 7.8, 9.1 } } ;
    y(vert) += 0.5 ;
    std::cout << x(vert) << ", " << y(vert) << ", " << z(vert)
              << ", " << u(vert) << ", " << v(vert) << '\n' ;
}
