#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' ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPCBzdGQ6OnNpemVfdCBQT1MgPiBzdHJ1Y3QgZ2V0X2FycmF5X2VsZW1lbnQKewogICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBUID4KICAgIGF1dG8gb3BlcmF0b3IoKSAoIFQmJiB0ICkgY29uc3QgLT4gZGVjbHR5cGUoICooIHN0ZDo6Zm9yd2FyZDxUPih0KSApLmFycmF5ICkKICAgIHsgcmV0dXJuIHN0ZDo6Zm9yd2FyZDxUPih0KS5hcnJheVtQT1NdIDsgfQp9OwoKc3RydWN0IHZlcnRleCB7IGZsb2F0IGFycmF5IFs1XSA7IH0gOwoKY29uc3RleHByIGF1dG8geCA9IGdldF9hcnJheV9lbGVtZW50PDA+KCkgOwpjb25zdGV4cHIgYXV0byB5ID0gZ2V0X2FycmF5X2VsZW1lbnQ8MT4oKSA7CmNvbnN0ZXhwciBhdXRvIHogPSBnZXRfYXJyYXlfZWxlbWVudDwyPigpIDsKY29uc3RleHByIGF1dG8gdSA9IGdldF9hcnJheV9lbGVtZW50PDM+KCkgOwpjb25zdGV4cHIgYXV0byB2ID0gZ2V0X2FycmF5X2VsZW1lbnQ8ND4oKSA7CgppbnQgbWFpbiAoKQp7CiAgICB2ZXJ0ZXggdmVydCB7IHsgMS4yLCAzLjQsIDUuNiwgNy44LCA5LjEgfSB9IDsKICAgIHkodmVydCkgKz0gMC41IDsKICAgIHN0ZDo6Y291dCA8PCB4KHZlcnQpIDw8ICIsICIgPDwgeSh2ZXJ0KSA8PCAiLCAiIDw8IHoodmVydCkKICAgICAgICAgICAgICA8PCAiLCAiIDw8IHUodmVydCkgPDwgIiwgIiA8PCB2KHZlcnQpIDw8ICdcbicgOwp9Cg==