#include <iostream>
struct foo {
int x;
int y;
int z;
};
struct foo_wrapper {
foo &ref;
foo_wrapper( foo &f ) : ref( f ) {}
int &operator[]( std::size_t rhs ) {
switch(rhs) {
case 0U:
return ref.x;
case 1U:
return ref.y;
case 2U:
return ref.z;
default:
return *(&(ref.z) + rhs - 2U);
}
}
};
foo_wrapper wrap( foo &ff )
{
return foo_wrapper( ff );
}
int main() {
foo f;
wrap( f )[1] = 123;
std::cout << f.y << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IGZvbyB7CiAgICBpbnQgeDsKICAgIGludCB5OwogICAgaW50IHo7Cn07CgpzdHJ1Y3QgZm9vX3dyYXBwZXIgewogICAgICAgIGZvbyAmcmVmOwoKICAgICAgICBmb29fd3JhcHBlciggZm9vICZmICkgOiByZWYoIGYgKSB7fQogICAgICAgIGludCAmb3BlcmF0b3JbXSggc3RkOjpzaXplX3QgcmhzICkgewogICAgICAgICAgIHN3aXRjaChyaHMpIHsKICAgICAgICAgICBjYXNlIDBVOgogICAgICAgICAgICAgICByZXR1cm4gcmVmLng7CiAgICAgICAgICAgY2FzZSAxVToKICAgICAgICAgICAgICAgcmV0dXJuIHJlZi55OwogICAgICAgICAgIGNhc2UgMlU6CiAgICAgICAgICAgICAgIHJldHVybiByZWYuejsKICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICByZXR1cm4gKigmKHJlZi56KSArIHJocyAtIDJVKTsKICAgICAgICAgICB9CiAgICAgICAgfQogfTsKCmZvb193cmFwcGVyIHdyYXAoIGZvbyAmZmYgKQp7CglyZXR1cm4gZm9vX3dyYXBwZXIoIGZmICk7Cn0KCmludCBtYWluKCkgewogICAgZm9vIGY7CiAgICB3cmFwKCBmIClbMV0gPSAxMjM7CiAgICBzdGQ6OmNvdXQgPDwgZi55IDw8IHN0ZDo6ZW5kbDsKfQ==