#include <iostream>
#include <stdexcept>
#include <boost/any.hpp>
class Committer
{
public:
template <typename T>
void mark_var_change(T *var)
{
mPointer = var;
}
template <typename T>
void commit_change(T new_value)
{
T* pointer = boost::any_cast<T*>(mPointer); // throw with bad type
if (pointer == nullptr) {
throw std::runtime_error("nullptr was stocked");
}
*pointer = new_value;
}
private:
boost::any mPointer;
};
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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RkZXhjZXB0PgoKI2luY2x1ZGUgPGJvb3N0L2FueS5ocHA+CgpjbGFzcyBDb21taXR0ZXIKewpwdWJsaWM6CQoKCXRlbXBsYXRlIDx0eXBlbmFtZSBUPgoJdm9pZCBtYXJrX3Zhcl9jaGFuZ2UoVCAqdmFyKQoJewoJICAgIG1Qb2ludGVyID0gdmFyOwoJfQoKCXRlbXBsYXRlIDx0eXBlbmFtZSBUPgoJdm9pZCBjb21taXRfY2hhbmdlKFQgbmV3X3ZhbHVlKQoJewoJCVQqIHBvaW50ZXIgPSBib29zdDo6YW55X2Nhc3Q8VCo+KG1Qb2ludGVyKTsgLy8gdGhyb3cgd2l0aCBiYWQgdHlwZQoJCWlmIChwb2ludGVyID09IG51bGxwdHIpIHsKCQkJdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJudWxscHRyIHdhcyBzdG9ja2VkIik7CgkJfQoJICAgICpwb2ludGVyID0gbmV3X3ZhbHVlOwoJfQoKcHJpdmF0ZToKICAgIGJvb3N0OjphbnkgbVBvaW50ZXI7Cn07CgoKaW50IG1haW4oKSB7CglDb21taXR0ZXIgYzsKCWludCBpOwoJZmxvYXQgZjsKCgljLm1hcmtfdmFyX2NoYW5nZSgmaSk7CgljLmNvbW1pdF9jaGFuZ2UoNDIpOwoJCgljLm1hcmtfdmFyX2NoYW5nZSgmZik7CgljLmNvbW1pdF9jaGFuZ2UoNC4yZik7CgkKCXN0ZDo6Y291dCA8PCBpIDw8ICIgIiA8PCBmIDw8IHN0ZDo6ZW5kbDsKfQo=