#include <iostream>
using namespace std;
struct myArray;
class proxy {
myArray &array;
int index;
public:
proxy(myArray &_array, int _index)
: array(_array)
, index(_index) {
}
proxy& operator=(int value);
operator int() const;
};
struct myArray {
int data[100];
proxy operator[](int index) {
return proxy(*this, index);
}
};
proxy& proxy::operator=(int value) {
cout << "Asigning " << value << " to element " << index << endl;
array.data[index] = value;
return *this;
}
proxy::operator int() const {
cout << "Reading element at " << index << endl;
array.data[index];
}
int main() {
myArray a;
a[5] = 123;
a[8] = 321;
int x = a[5];
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IG15QXJyYXk7CgpjbGFzcyBwcm94eSB7CglteUFycmF5ICZhcnJheTsKCWludCBpbmRleDsKcHVibGljOgogICAgcHJveHkobXlBcnJheSAmX2FycmF5LCBpbnQgX2luZGV4KQogICAgOiAgIGFycmF5KF9hcnJheSkKICAgICwgICBpbmRleChfaW5kZXgpIHsKICAgIH0KICAgIHByb3h5JiBvcGVyYXRvcj0oaW50IHZhbHVlKTsKICAgIG9wZXJhdG9yIGludCgpIGNvbnN0Owp9OwpzdHJ1Y3QgbXlBcnJheSB7CglpbnQgZGF0YVsxMDBdOwoJcHJveHkgb3BlcmF0b3JbXShpbnQgaW5kZXgpIHsKCQlyZXR1cm4gcHJveHkoKnRoaXMsIGluZGV4KTsKCX0KfTsKCnByb3h5JiBwcm94eTo6b3BlcmF0b3I9KGludCB2YWx1ZSkgewoJY291dCA8PCAiQXNpZ25pbmcgIiA8PCB2YWx1ZSA8PCAiIHRvIGVsZW1lbnQgIiA8PCBpbmRleCA8PCBlbmRsOwoJYXJyYXkuZGF0YVtpbmRleF0gPSB2YWx1ZTsKCXJldHVybiAqdGhpczsKfQoKcHJveHk6Om9wZXJhdG9yIGludCgpIGNvbnN0IHsKCWNvdXQgPDwgIlJlYWRpbmcgZWxlbWVudCBhdCAiIDw8IGluZGV4IDw8IGVuZGw7CglhcnJheS5kYXRhW2luZGV4XTsKfQoKaW50IG1haW4oKSB7CglteUFycmF5IGE7CglhWzVdID0gMTIzOwoJYVs4XSA9IDMyMTsKCWludCB4ID0gYVs1XTsKCXJldHVybiAwOwp9