#include <iostream>
#include <string>
#include <map>
#include <assert.h>
struct IObj {
//------ Подход 1 ----------------------------------------------
struct ExtraOptionsBase {
virtual ~ExtraOptionsBase() {}
};
virtual void SetEO( ExtraOptionsBase& ) = 0; // Можно сделдать дефолтную пустую реализацию
virtual ExtraOptionsBase& GetEO() = 0;
//------ Подход 2 ----------------------------------------------
virtual bool SetOption( const std::string& name, const int& value ) { return false; }
virtual bool TryGetOption( const std::string& name, int& value ) { return false; }
virtual bool SetOption( const std::string& name, const std::string& value ) { return false; }
virtual bool TryGetOption( const std::string& name, std::string& value ) { return false; }
template<typename T> T GetOption( const std::string& name ) {
T res = T();
bool is_ok = this->TryGetOption( name, res );
assert( is_ok );
return res;
}
};
template<typename T>
struct CObj : public IObj {
//------ Подход 1 ----------------------------------------------
struct ExtraOptions : public IObj::ExtraOptionsBase {
T Param1;
T Param2;
T* getField( const std::string& name ) {
if( name == "Param1" )
return &this->Param1;
if( name == "Param2" )
return &this->Param2;
return 0;
}
} Data;
virtual ExtraOptions& GetEO() { return this->Data; }
virtual void SetEO( ExtraOptions& ed ) { this->Data = ed; }
virtual void SetEO( ExtraOptionsBase& ed ) { this->Data = dynamic_cast<ExtraOptions&>(ed); }
//------ Подход 2 ----------------------------------------------
virtual bool SetOption( const std::string& name, const T& value ) {
T* field = this->Data.getField( name );
if( field ) {
*field = value;
return true;
}
return false;
}
virtual bool TryGetOption( const std::string& name, T& value ) {
T* field = this->Data.getField( name );
if( field ) {
value = *field;
return true;
}
return false;
}
};
using namespace std;
int main() {
std::map<std::string, int> pi = {
{ "Param1", 5 },
{ "Param2", 10 },
};
CObj<int> oi1, oi2;
for( auto i = pi.begin(); i != pi.end(); ++i )
oi1.SetOption( i->first, i->second );
oi2.SetEO( oi1.GetEO() );
std::cout << oi2.GetEO().Param1 << " " << oi2.GetOption<int>( "Param2" ) << std::endl;
std::map<std::string, std::string> ps = {
{ "Param1", "Hello" },
{ "Param2", "world!" },
};
CObj<std::string> os1;
for( auto i = ps.begin(); i != ps.end(); ++i )
os1.SetOption( i->first, i->second );
std::cout << os1.GetEO().Param1 << " " << os1.GetOption<std::string>( "Param2" ) << std::endl;
// your code goes here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CgpzdHJ1Y3QgSU9iaiB7CgkvLy0tLS0tLSDQn9C+0LTRhdC+0LQgMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglzdHJ1Y3QgRXh0cmFPcHRpb25zQmFzZSB7CgkJdmlydHVhbCB+RXh0cmFPcHRpb25zQmFzZSgpIHt9Cgl9OwkKCQoJdmlydHVhbCB2b2lkIFNldEVPKCBFeHRyYU9wdGlvbnNCYXNlJiApID0gMDsgLy8g0JzQvtC20L3QviDRgdC00LXQu9C00LDRgtGMINC00LXRhNC+0LvRgtC90YPRjiDQv9GD0YHRgtGD0Y4g0YDQtdCw0LvQuNC30LDRhtC40Y4KCXZpcnR1YWwgRXh0cmFPcHRpb25zQmFzZSYgR2V0RU8oKSA9IDA7CgoJLy8tLS0tLS0g0J/QvtC00YXQvtC0IDIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJdmlydHVhbCBib29sIFNldE9wdGlvbiggY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IGludCYgdmFsdWUgKSAgeyByZXR1cm4gZmFsc2U7IH0KCXZpcnR1YWwgYm9vbCBUcnlHZXRPcHRpb24oIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBpbnQmIHZhbHVlICkgeyByZXR1cm4gZmFsc2U7IH0KCXZpcnR1YWwgYm9vbCBTZXRPcHRpb24oIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUgKSB7IHJldHVybiBmYWxzZTsgfQoJdmlydHVhbCBib29sIFRyeUdldE9wdGlvbiggY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHN0ZDo6c3RyaW5nJiB2YWx1ZSApIHsgcmV0dXJuIGZhbHNlOyB9CgkKCXRlbXBsYXRlPHR5cGVuYW1lIFQ+IFQgR2V0T3B0aW9uKCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSApIHsKCQlUIHJlcyA9IFQoKTsKCQlib29sIGlzX29rID0gdGhpcy0+VHJ5R2V0T3B0aW9uKCBuYW1lLCByZXMgKTsgCgkJYXNzZXJ0KCBpc19vayApOwoJCXJldHVybiByZXM7Cgl9CQp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IENPYmogOiBwdWJsaWMgSU9iaiB7CgkvLy0tLS0tLSDQn9C+0LTRhdC+0LQgMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglzdHJ1Y3QgRXh0cmFPcHRpb25zIDogcHVibGljIElPYmo6OkV4dHJhT3B0aW9uc0Jhc2UgewoJCVQgUGFyYW0xOwoJCVQgUGFyYW0yOwoJCQoJCVQqIGdldEZpZWxkKCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSApIHsKCQkJaWYoIG5hbWUgPT0gIlBhcmFtMSIgKQoJCQkJcmV0dXJuICZ0aGlzLT5QYXJhbTE7CgkJCWlmKCBuYW1lID09ICJQYXJhbTIiICkKCQkJCXJldHVybiAmdGhpcy0+UGFyYW0yOwoJCQlyZXR1cm4gMDsKCQl9Cgl9IERhdGE7CgkKCXZpcnR1YWwgRXh0cmFPcHRpb25zJiBHZXRFTygpIHsgcmV0dXJuIHRoaXMtPkRhdGE7IH0KCXZpcnR1YWwgdm9pZCBTZXRFTyggRXh0cmFPcHRpb25zJiBlZCApIHsgdGhpcy0+RGF0YSA9IGVkOyB9Cgl2aXJ0dWFsIHZvaWQgU2V0RU8oIEV4dHJhT3B0aW9uc0Jhc2UmIGVkICkgeyB0aGlzLT5EYXRhID0gZHluYW1pY19jYXN0PEV4dHJhT3B0aW9ucyY+KGVkKTsgfQoJCgkvLy0tLS0tLSDQn9C+0LTRhdC+0LQgMiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgl2aXJ0dWFsIGJvb2wgU2V0T3B0aW9uKCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgVCYgdmFsdWUgKSB7CgkJVCogZmllbGQgPSB0aGlzLT5EYXRhLmdldEZpZWxkKCBuYW1lICk7CgkJaWYoIGZpZWxkICkgewoJCQkqZmllbGQgPSB2YWx1ZTsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCQoJdmlydHVhbCBib29sIFRyeUdldE9wdGlvbiggY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIFQmIHZhbHVlICkgeyAKCQlUKiBmaWVsZCA9IHRoaXMtPkRhdGEuZ2V0RmllbGQoIG5hbWUgKTsKCQlpZiggZmllbGQgKSB7CgkJCXZhbHVlID0gKmZpZWxkOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQp9OwoKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgbWFpbigpIHsKCQoJc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gcGkgPSB7CgkJeyAiUGFyYW0xIiwgNSB9LAkKCQl7ICJQYXJhbTIiLCAxMCB9LAkKCX07CglDT2JqPGludD4gb2kxLCBvaTI7Cglmb3IoIGF1dG8gaSA9IHBpLmJlZ2luKCk7IGkgIT0gcGkuZW5kKCk7ICsraSApCgkJb2kxLlNldE9wdGlvbiggaS0+Zmlyc3QsIGktPnNlY29uZCApOwoJb2kyLlNldEVPKCBvaTEuR2V0RU8oKSApOwoJc3RkOjpjb3V0IDw8IG9pMi5HZXRFTygpLlBhcmFtMSA8PCAiICIgPDwgb2kyLkdldE9wdGlvbjxpbnQ+KCAiUGFyYW0yIiApIDw8IHN0ZDo6ZW5kbDsKCQoJc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBwcyA9IHsKCQl7ICJQYXJhbTEiLCAiSGVsbG8iIH0sCQoJCXsgIlBhcmFtMiIsICJ3b3JsZCEiIH0sCQoJfTsKCUNPYmo8c3RkOjpzdHJpbmc+IG9zMTsKCWZvciggYXV0byBpID0gcHMuYmVnaW4oKTsgaSAhPSBwcy5lbmQoKTsgKytpICkgCgkJb3MxLlNldE9wdGlvbiggaS0+Zmlyc3QsIGktPnNlY29uZCApOwoJc3RkOjpjb3V0IDw8IG9zMS5HZXRFTygpLlBhcmFtMSA8PCAiICIgPDwgb3MxLkdldE9wdGlvbjxzdGQ6OnN0cmluZz4oICJQYXJhbTIiICkgPDwgc3RkOjplbmRsOwoKCQoJCgkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCglyZXR1cm4gMDsKfQ==