#include <map>
#include <iostream>
#include <string>
class BaseOption {
public:
virtual ~BaseOption() {}
};
template<typename T>
class Option : public BaseOption {
public:
explicit Option(T* v) {value = v;}
~Option() { delete value; }
T* value;
};
typedef std::map <std::string, BaseOption*> OptionMap;
OptionMap options_;
template<typename T>
void Set(const std::string& option_, T* value)
{
BaseOption*& option_member = options_[option_];
delete option_member;
option_member = new Option<T>(value);
}
template<typename T>
void printAll()
{
std::cout << "#Elem in Map " << options_.size() << std::endl;
OptionMap::const_iterator it;
for (it = options_.begin(); it != options_.end(); ++it)
std::cout << "Arg: " << it->first << " Value: " << " Pointer: " << it->second <<
" Pointer to value: " << static_cast<Option<T>*>(it->second)->value << std::endl;
}
using namespace std;
using namespace std;
int main()
{
int tempval = 8000;
cout << "Here is &tempVal " << &tempval << endl;
Set<int>("IeAIf", &tempval);
Set<int>("LcE8V", &tempval);
tempval = 16000;
Set<int>("RVn1C", &tempval);
Set<int>("XINa2", &tempval);
tempval = 1;
Set<int>("st6Vz", &tempval);
printAll<int>();
}
I2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKY2xhc3MgQmFzZU9wdGlvbiB7CnB1YmxpYzoKCXZpcnR1YWwgfkJhc2VPcHRpb24oKSB7fQp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgT3B0aW9uIDogcHVibGljIEJhc2VPcHRpb24gewpwdWJsaWM6CglleHBsaWNpdCBPcHRpb24oVCogdikge3ZhbHVlID0gdjt9Cgl+T3B0aW9uKCkgeyBkZWxldGUgdmFsdWU7IH0KCVQqIHZhbHVlOwp9OwoKdHlwZWRlZiBzdGQ6Om1hcCA8c3RkOjpzdHJpbmcsIEJhc2VPcHRpb24qPiBPcHRpb25NYXA7CgpPcHRpb25NYXAgb3B0aW9uc187Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp2b2lkIFNldChjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uXywgVCogdmFsdWUpIAp7CglCYXNlT3B0aW9uKiYgb3B0aW9uX21lbWJlciA9IG9wdGlvbnNfW29wdGlvbl9dOwoJZGVsZXRlIG9wdGlvbl9tZW1iZXI7CglvcHRpb25fbWVtYmVyID0gbmV3IE9wdGlvbjxUPih2YWx1ZSk7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnZvaWQgcHJpbnRBbGwoKQp7CglzdGQ6OmNvdXQgPDwgIiNFbGVtIGluIE1hcCAiIDw8IG9wdGlvbnNfLnNpemUoKSA8PCBzdGQ6OmVuZGw7CgoJT3B0aW9uTWFwOjpjb25zdF9pdGVyYXRvciBpdDsKCWZvciAoaXQgPSBvcHRpb25zXy5iZWdpbigpOyBpdCAhPSBvcHRpb25zXy5lbmQoKTsgKytpdCkKCQlzdGQ6OmNvdXQgPDwgIkFyZzogIiA8PCBpdC0+Zmlyc3QgPDwgICAgIiAgVmFsdWU6ICIgPDwgIiAgUG9pbnRlcjogIiA8PCBpdC0+c2Vjb25kIDw8IAoJCSIgIFBvaW50ZXIgdG8gdmFsdWU6ICIgPDwgc3RhdGljX2Nhc3Q8T3B0aW9uPFQ+Kj4oaXQtPnNlY29uZCktPnZhbHVlICAgPDwgc3RkOjplbmRsOwp9Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBtYWluKCkgCnsKCWludCB0ZW1wdmFsID0gODAwMDsKCWNvdXQgPDwgIkhlcmUgaXMgJnRlbXBWYWwgIiA8PCAmdGVtcHZhbCA8PCBlbmRsOwoJU2V0PGludD4oIkllQUlmIiwgJnRlbXB2YWwpOwoJU2V0PGludD4oIkxjRThWIiwgJnRlbXB2YWwpOwoKCXRlbXB2YWwgPSAxNjAwMDsKCVNldDxpbnQ+KCJSVm4xQyIsICZ0ZW1wdmFsKTsKCVNldDxpbnQ+KCJYSU5hMiIsICZ0ZW1wdmFsKTsKCgl0ZW1wdmFsID0gMTsKCVNldDxpbnQ+KCJzdDZWeiIsICZ0ZW1wdmFsKTsKCXByaW50QWxsPGludD4oKTsKfQkK