#include <iostream>
#include <stdexcept>
class Committer
{
public:
template <typename T>
void mark_var_change(T *var)
{
mPointer = var;
}
template <typename T>
void commit_change(T new_value)
{
if (mPointer == nullptr) {
throw std::runtime_error("nullptr was stocked");
}
*reinterpret_cast<T*>(mPointer) = new_value;
}
private:
void* mPointer = nullptr;
};
int main() {
Committer c;
int i;
float f;
c.mark_var_change(&i);
c.commit_change(42);
c.mark_var_change(&f);
c.commit_change(4.2f);
std::cout << i << " " << f << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkZXhjZXB0PgoKY2xhc3MgQ29tbWl0dGVyCnsKcHVibGljOgkKCgl0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KCXZvaWQgbWFya192YXJfY2hhbmdlKFQgKnZhcikKCXsKCSAgICBtUG9pbnRlciA9IHZhcjsKCX0KCgl0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KCXZvaWQgY29tbWl0X2NoYW5nZShUIG5ld192YWx1ZSkKCXsKCQlpZiAobVBvaW50ZXIgPT0gbnVsbHB0cikgewoJCQl0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIm51bGxwdHIgd2FzIHN0b2NrZWQiKTsKCQl9CgkgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8VCo+KG1Qb2ludGVyKSA9IG5ld192YWx1ZTsKCX0KCnByaXZhdGU6CiAgICB2b2lkKiBtUG9pbnRlciA9IG51bGxwdHI7Cn07CgoKaW50IG1haW4oKSB7CglDb21taXR0ZXIgYzsKCWludCBpOwoJZmxvYXQgZjsKCgljLm1hcmtfdmFyX2NoYW5nZSgmaSk7CgljLmNvbW1pdF9jaGFuZ2UoNDIpOwoJCgljLm1hcmtfdmFyX2NoYW5nZSgmZik7CgljLmNvbW1pdF9jaGFuZ2UoNC4yZik7CgkKCXN0ZDo6Y291dCA8PCBpIDw8ICIgIiA8PCBmIDw8IHN0ZDo6ZW5kbDsKfQo=