I have the following vector class (vector as in spatial, not array):
template<typename T0, size_t S, typename = typename std::enable_if<std::is_arithmetic<T0>::value && (S > 1 && S < 5)>::type>
struct Vec
{
    using value_type = T0;
    using vector_type = Vec<T0, S>;
    using array_type = std::array<T0, S>;
    using index_type = size_t;
    using size_type = size_t;
    enum { num_components = S };
    array_type v;
};
, such that I can make a vector type with 2, 3 or 4 elements:
    template<typename T0>
    using Vec2 = Vec<T0, 2>;
    template<typename T0>
    using Vec3 = Vec<T0, 3>;
    template<typename T0>
    using Vec4 = Vec<T0, 4>;
Access is of the form v[0], v[1], etc. (for brevity I don't include the [] operator overloads). Sometimes I prefer x, y and so on but don't want the extra "." from naming the structs in the union. So using a non-standard "feature" of Visual Studio 2013, tried to use an anonymous union, only enabling the value if S (dimension) is 2, 3 or 4, as follows:
    template<typename T0, size_t S, typename = typename std::enable_if<std::is_arithmetic<T0>::value && (S > 1 && S < 5)>::type>
    struct Vec
    {
        using value_type = T0;
        using vector_type = Vec<T0, S>;
        using array_type = std::array<T0, S>;
        using index_type = size_t;
        using size_type = size_t;
        enum { num_components = S };
        union
        {
            array_type v;
            template<typename = typename std::enable_if<S == 2>::type>
            struct
            {
                value_type x, y;
            };
            template<typename = typename std::enable_if<S == 3>::type>
            struct
            {
                value_type x, y, z;
            };
            template<typename = typename std::enable_if<S == 4>::type>
            struct
            {
                value_type x, y, z, w;
            };
        };
    };
Unfortunately this gives me the following error:
**error C2332: 'struct' : missing tag name**
And in a way I suppose it is. Is there any way to achieve what I'm trying here? I'm sure enable/disable of an anoymous struct almost certainly gives the compiler a migrane. I can use anonymous union like this if I give the struct a name of course.