#include <iostream>
using namespace std;
template<typename T>
class CAutoVar
{
public:
template<typename TVar>
class var
{
public:
var(CAutoVar<TVar> &handler, TVar &var) : m_Handler(handler), m_Var(var) {};
~var()
{
m_Handler.check();
}
operator TVar&() { return m_Var; }
private:
TVar &m_Var;
CAutoVar<TVar> &m_Handler;
};
typedef var<T> var_type;
CAutoVar(T rhs = T());
operator var_type();
T& operator=(T &rhs);
private:
void check();
private:
T m_Var;
};
template<typename T>
void CAutoVar<T>::check()
{
printf("checked %d\n", m_Var);
}
template<typename T>
CAutoVar<T>::CAutoVar(T rhs)
: m_Var(rhs)
{
}
template<typename T>
CAutoVar<T>::operator var_type()
{
return var_type(*this, m_Var);
}
template<typename T>
T &CAutoVar<T>::operator=(T &rhs)
{
m_Var = rhs;
return m_Var;
}
int main()
{
CAutoVar<int> n;
printf("%d\n", n); // 0
static_cast<CAutoVar<int>::var_type>(n) += 10;
printf("%d\n", n); // 10
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgQ0F1dG9WYXIKewpwdWJsaWM6CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUVmFyPgogICAgY2xhc3MgdmFyCiAgICB7ICAgICAgICAgCiAgICBwdWJsaWM6CiAgICAgICAgdmFyKENBdXRvVmFyPFRWYXI+ICZoYW5kbGVyLCBUVmFyICZ2YXIpIDogbV9IYW5kbGVyKGhhbmRsZXIpLCBtX1Zhcih2YXIpIHt9OwogICAgICAgIH52YXIoKSAKICAgICAgICB7IAogICAgICAgICAgICBtX0hhbmRsZXIuY2hlY2soKTsgCiAgICAgICAgfQogICAgICAgIG9wZXJhdG9yIFRWYXImKCkgeyByZXR1cm4gbV9WYXI7IH0KCiAgICBwcml2YXRlOgogICAgICAgIFRWYXIgJm1fVmFyOwogICAgICAgIENBdXRvVmFyPFRWYXI+ICZtX0hhbmRsZXI7CiAgICB9OwoKICAgIHR5cGVkZWYgdmFyPFQ+IHZhcl90eXBlOwoKICAgIENBdXRvVmFyKFQgcmhzID0gVCgpKTsKICAgIG9wZXJhdG9yIHZhcl90eXBlKCk7CiAgICBUJiBvcGVyYXRvcj0oVCAmcmhzKTsKCnByaXZhdGU6CiAgICB2b2lkIGNoZWNrKCk7Cgpwcml2YXRlOgogICAgVCAgIG1fVmFyOwp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kdm9pZCBDQXV0b1ZhcjxUPjo6Y2hlY2soKQp7CiAgICBwcmludGYoImNoZWNrZWQgJWRcbiIsIG1fVmFyKTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KQ0F1dG9WYXI8VD46OkNBdXRvVmFyKFQgcmhzKQogICAgOiBtX1ZhcihyaHMpCnsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KQ0F1dG9WYXI8VD46Om9wZXJhdG9yIHZhcl90eXBlKCkKewogICAgcmV0dXJuIHZhcl90eXBlKCp0aGlzLCBtX1Zhcik7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+ClQgJkNBdXRvVmFyPFQ+OjpvcGVyYXRvcj0oVCAmcmhzKQp7CiAgICBtX1ZhciA9IHJoczsKICAgIHJldHVybiBtX1ZhcjsKfQoKCmludCBtYWluKCkKewogICAgQ0F1dG9WYXI8aW50PiBuOwogICAgcHJpbnRmKCIlZFxuIiwgbik7ICAgIC8vIDAKCiAgICBzdGF0aWNfY2FzdDxDQXV0b1ZhcjxpbnQ+Ojp2YXJfdHlwZT4obikgKz0gMTA7CiAgICBwcmludGYoIiVkXG4iLCBuKTsgICAgLy8gMTAKCiAgICByZXR1cm4gMDsKfQo=