#include <iostream>
template <class T>
class Logger
{
T value;
public:
T& operator=(const T& other)
{
std::cout << "Setting new value\n";
value = other;
return value;
}
operator T() const
{
return value;
}
};
class Foo
{
public:
Foo() {}
void SetBar(int value)
{
//Log that m_bar is going to be changed
m_bar = value;
}
private:
#if 1
Logger<int> m_bar; // the variable we want to track
#else
int m_bar; // the variable we want to track
#endif
};
int main()
{
auto f = Foo();
f.SetBar(12);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNsYXNzIExvZ2dlcgp7CiAgVCB2YWx1ZTsKCnB1YmxpYzoKCiAgVCYgb3BlcmF0b3I9KGNvbnN0IFQmIG90aGVyKQogIHsKICAgIHN0ZDo6Y291dCA8PCAiU2V0dGluZyBuZXcgdmFsdWVcbiI7CiAgICB2YWx1ZSA9IG90aGVyOwogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgb3BlcmF0b3IgVCgpIGNvbnN0CiAgewogICAgcmV0dXJuIHZhbHVlOwogIH0KCn07CgpjbGFzcyBGb28KewpwdWJsaWM6CiAgICBGb28oKSB7fQoKICAgIHZvaWQgU2V0QmFyKGludCB2YWx1ZSkKICAgIHsKICAgICAgICAvL0xvZyB0aGF0IG1fYmFyIGlzIGdvaW5nIHRvIGJlIGNoYW5nZWQKICAgICAgICBtX2JhciA9IHZhbHVlOwogICAgfQoKcHJpdmF0ZToKCiNpZiAxCiAgICBMb2dnZXI8aW50PiBtX2JhcjsgLy8gdGhlIHZhcmlhYmxlIHdlIHdhbnQgdG8gdHJhY2sKI2Vsc2UKICAgIGludCBtX2JhcjsgLy8gdGhlIHZhcmlhYmxlIHdlIHdhbnQgdG8gdHJhY2sKI2VuZGlmCgp9OwoKaW50IG1haW4oKQp7CiAgYXV0byBmID0gRm9vKCk7CiAgZi5TZXRCYXIoMTIpOwp9