#include <iostream>
#include <map>
using namespace std;
template<typename T>
struct ValueProxy
{
ValueProxy(T& v)
: value(v)
{
}
operator T&()
{
return value;
}
operator const T&() const
{
return value;
}
ValueProxy& operator=(const T& nv)
{
value = nv;
return *this;
}
T& value;
};
template<typename Key, typename Value>
struct SomeMap
{
// Helpers
using parent_t = std::map<Key, Value>;
parent_t holder;
// Part of interest
ValueProxy<Value> operator[](const Key& key)
{
return {holder[key]};
}
};
void modify(int& a) {// базовый метод
a += 5;
}
void dump(const SomeMap<int,int> &mp)
{
for (auto v : mp.holder)
{
cout << std::get<1>(v) << ' ';
}
cout << endl;
}
int main()
{
SomeMap<int, int> mp;
// Proxy test 1
mp[2] = 100;
dump(mp);
// Proxy test 2
modify(mp[2]);
dump(mp);
// Proxt test 3
mp[2] = mp[2] + 100;
dump(mp);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IFZhbHVlUHJveHkKewoJVmFsdWVQcm94eShUJiB2KQoJCTogdmFsdWUodikKCXsKCX0KCQoJb3BlcmF0b3IgVCYoKQoJewoJCXJldHVybiB2YWx1ZTsKCX0KCQoJb3BlcmF0b3IgY29uc3QgVCYoKSBjb25zdAoJewoJCXJldHVybiB2YWx1ZTsKCX0KCQoJVmFsdWVQcm94eSYgb3BlcmF0b3I9KGNvbnN0IFQmIG52KQoJewoJCXZhbHVlID0gbnY7CgkJcmV0dXJuICp0aGlzOwoJfQoJCglUJiB2YWx1ZTsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgVmFsdWU+CnN0cnVjdCBTb21lTWFwCnsKCS8vIEhlbHBlcnMKCXVzaW5nIHBhcmVudF90ID0gc3RkOjptYXA8S2V5LCBWYWx1ZT47CglwYXJlbnRfdCBob2xkZXI7CgkKCS8vIFBhcnQgb2YgaW50ZXJlc3QKCVZhbHVlUHJveHk8VmFsdWU+IG9wZXJhdG9yW10oY29uc3QgS2V5JiBrZXkpCgl7CgkJcmV0dXJuIHtob2xkZXJba2V5XX07Cgl9Cn07Cgp2b2lkIG1vZGlmeShpbnQmIGEpIHsvLyDQsdCw0LfQvtCy0YvQuSDQvNC10YLQvtC0CiAgICBhICs9IDU7Cn0KCnZvaWQgZHVtcChjb25zdCBTb21lTWFwPGludCxpbnQ+ICZtcCkKewoJZm9yIChhdXRvIHYgOiBtcC5ob2xkZXIpCgl7CgkJY291dCA8PCBzdGQ6OmdldDwxPih2KSA8PCAnICc7Cgl9Cgljb3V0IDw8IGVuZGw7Cn0KCmludCBtYWluKCkgCnsKCVNvbWVNYXA8aW50LCBpbnQ+IG1wOwoJCgkvLyBQcm94eSB0ZXN0IDEKCW1wWzJdID0gMTAwOwoJZHVtcChtcCk7CgkKCS8vIFByb3h5IHRlc3QgMgoJbW9kaWZ5KG1wWzJdKTsKCWR1bXAobXApOwoJCgkvLyBQcm94dCB0ZXN0IDMKCW1wWzJdID0gbXBbMl0gKyAxMDA7CglkdW1wKG1wKTsKCQoJCgkKCXJldHVybiAwOwp9Cg==