#include <iostream>
#include <type_traits>
#include <cstddef>
template <typename T> struct vector_fields_1 { union { T values[1]; struct { T x; }; }; };
template <typename T> struct vector_fields_2 { union { T values[2]; struct { T x, y; }; }; };
template <typename T> struct vector_fields_3 { union { T values[3]; struct { T x, y, z; }; }; };
template <typename T> struct vector_fields_4 { union { T values[4]; struct { T x, y, z, w; }; }; };
template <typename T, std::size_t N> struct vector_fields_n { T values[N]; };
template <class T, std::size_t N>
struct vector : public
std::conditional<
N == 1
&& offsetof(vector_fields_1<T>, x) == offsetof(vector_fields_1<T>, values[0])
,
vector_fields_1<T>,
typename std::conditional<
N == 2
&& offsetof(vector_fields_2<T>, x) == offsetof(vector_fields_2<T>, values[0])
&& offsetof(vector_fields_2<T>, y) == offsetof(vector_fields_2<T>, values[1])
,
vector_fields_2<T>,
typename std::conditional<
N == 3
&& offsetof(vector_fields_3<T>, x) == offsetof(vector_fields_3<T>, values[0])
&& offsetof(vector_fields_3<T>, y) == offsetof(vector_fields_3<T>, values[1])
&& offsetof(vector_fields_3<T>, z) == offsetof(vector_fields_3<T>, values[2])
,
vector_fields_3<T>,
typename std::conditional<
N == 4
&& offsetof(vector_fields_4<T>, x) == offsetof(vector_fields_4<T>, values[0])
&& offsetof(vector_fields_4<T>, y) == offsetof(vector_fields_4<T>, values[1])
&& offsetof(vector_fields_4<T>, z) == offsetof(vector_fields_4<T>, values[2])
&& offsetof(vector_fields_4<T>, w) == offsetof(vector_fields_4<T>, values[3])
,
vector_fields_4<T>,
vector_fields_n<T, N>
>::type
>::type
>::type
>::type
{
T& operator[](std::size_t pos) { return this->values[pos]; }
const T& operator[](std::size_t pos) const { return this->values[pos]; }
};
int main(int, char**) {
vector<int, 3> obj;
obj[0] = 1;
obj.y = 2;
obj[2] = 3;
std::cout << "(" << obj.x << ", " << obj[1] << ", " << obj.z << ")" << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDxjc3RkZGVmPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCB2ZWN0b3JfZmllbGRzXzEgeyB1bmlvbiB7IFQgdmFsdWVzWzFdOyBzdHJ1Y3QgeyBUIHg7ICAgICAgICAgIH07IH07IH07CnRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgdmVjdG9yX2ZpZWxkc18yIHsgdW5pb24geyBUIHZhbHVlc1syXTsgc3RydWN0IHsgVCB4LCB5OyAgICAgICB9OyB9OyB9Owp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IHZlY3Rvcl9maWVsZHNfMyB7IHVuaW9uIHsgVCB2YWx1ZXNbM107IHN0cnVjdCB7IFQgeCwgeSwgejsgICAgfTsgfTsgfTsKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCB2ZWN0b3JfZmllbGRzXzQgeyB1bmlvbiB7IFQgdmFsdWVzWzRdOyBzdHJ1Y3QgeyBUIHgsIHksIHosIHc7IH07IH07IH07CnRlbXBsYXRlIDx0eXBlbmFtZSBULCBzdGQ6OnNpemVfdCBOPiBzdHJ1Y3QgdmVjdG9yX2ZpZWxkc19uIHsgVCB2YWx1ZXNbTl07IH07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgc3RkOjpzaXplX3QgTj4Kc3RydWN0IHZlY3RvciA6IHB1YmxpYwoJc3RkOjpjb25kaXRpb25hbDwKCQlOID09IDEKCQkJJiYgb2Zmc2V0b2YodmVjdG9yX2ZpZWxkc18xPFQ+LCB4KSA9PSBvZmZzZXRvZih2ZWN0b3JfZmllbGRzXzE8VD4sIHZhbHVlc1swXSkKCQksCgkJdmVjdG9yX2ZpZWxkc18xPFQ+LAoJCXR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8CgkJCU4gPT0gMgoJCQkJJiYgb2Zmc2V0b2YodmVjdG9yX2ZpZWxkc18yPFQ+LCB4KSA9PSBvZmZzZXRvZih2ZWN0b3JfZmllbGRzXzI8VD4sIHZhbHVlc1swXSkKCQkJCSYmIG9mZnNldG9mKHZlY3Rvcl9maWVsZHNfMjxUPiwgeSkgPT0gb2Zmc2V0b2YodmVjdG9yX2ZpZWxkc18yPFQ+LCB2YWx1ZXNbMV0pCgkJCSwKCQkJdmVjdG9yX2ZpZWxkc18yPFQ+LAoJCQl0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPAoJCQkJTiA9PSAzCgkJCQkJJiYgb2Zmc2V0b2YodmVjdG9yX2ZpZWxkc18zPFQ+LCB4KSA9PSBvZmZzZXRvZih2ZWN0b3JfZmllbGRzXzM8VD4sIHZhbHVlc1swXSkKCQkJCQkmJiBvZmZzZXRvZih2ZWN0b3JfZmllbGRzXzM8VD4sIHkpID09IG9mZnNldG9mKHZlY3Rvcl9maWVsZHNfMzxUPiwgdmFsdWVzWzFdKQoJCQkJCSYmIG9mZnNldG9mKHZlY3Rvcl9maWVsZHNfMzxUPiwgeikgPT0gb2Zmc2V0b2YodmVjdG9yX2ZpZWxkc18zPFQ+LCB2YWx1ZXNbMl0pCgkJCQksCgkJCQl2ZWN0b3JfZmllbGRzXzM8VD4sCgkJCQl0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPAoJCQkJCU4gPT0gNAoJCQkJCQkmJiBvZmZzZXRvZih2ZWN0b3JfZmllbGRzXzQ8VD4sIHgpID09IG9mZnNldG9mKHZlY3Rvcl9maWVsZHNfNDxUPiwgdmFsdWVzWzBdKQoJCQkJCQkmJiBvZmZzZXRvZih2ZWN0b3JfZmllbGRzXzQ8VD4sIHkpID09IG9mZnNldG9mKHZlY3Rvcl9maWVsZHNfNDxUPiwgdmFsdWVzWzFdKQoJCQkJCQkmJiBvZmZzZXRvZih2ZWN0b3JfZmllbGRzXzQ8VD4sIHopID09IG9mZnNldG9mKHZlY3Rvcl9maWVsZHNfNDxUPiwgdmFsdWVzWzJdKQoJCQkJCQkmJiBvZmZzZXRvZih2ZWN0b3JfZmllbGRzXzQ8VD4sIHcpID09IG9mZnNldG9mKHZlY3Rvcl9maWVsZHNfNDxUPiwgdmFsdWVzWzNdKQoJCQkJCSwKCQkJCQl2ZWN0b3JfZmllbGRzXzQ8VD4sCgkJCQkJdmVjdG9yX2ZpZWxkc19uPFQsIE4+CgkJCQk+Ojp0eXBlCgkJCT46OnR5cGUKCQk+Ojp0eXBlCgk+Ojp0eXBlCnsKCVQmIG9wZXJhdG9yW10oc3RkOjpzaXplX3QgcG9zKSB7IHJldHVybiB0aGlzLT52YWx1ZXNbcG9zXTsgfQoJY29uc3QgVCYgb3BlcmF0b3JbXShzdGQ6OnNpemVfdCBwb3MpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPnZhbHVlc1twb3NdOyB9Cn07CgppbnQgbWFpbihpbnQsIGNoYXIqKikgewoJdmVjdG9yPGludCwgMz4gb2JqOwoJb2JqWzBdID0gMTsKCW9iai55ICA9IDI7CglvYmpbMl0gPSAzOwoJc3RkOjpjb3V0IDw8ICIoIiA8PCBvYmoueCA8PCAiLCAiIDw8IG9ialsxXSA8PCAiLCAiIDw8IG9iai56IDw8ICIpIiA8PCBzdGQ6OmVuZGw7CglyZXR1cm4gMDsKfQo=