fork download
  1. #include <iostream>
  2. #include <string>
  3. #include <map>
  4. #include <assert.h>
  5.  
  6. struct IObj {
  7. //------ Подход 1 ----------------------------------------------
  8. struct ExtraOptionsBase {
  9. virtual ~ExtraOptionsBase() {}
  10. };
  11.  
  12. virtual void SetEO( ExtraOptionsBase& ) = 0; // Можно сделдать дефолтную пустую реализацию
  13. virtual ExtraOptionsBase& GetEO() = 0;
  14.  
  15. //------ Подход 2 ----------------------------------------------
  16. virtual bool SetOption( const std::string& name, const int& value ) { return false; }
  17. virtual bool TryGetOption( const std::string& name, int& value ) { return false; }
  18. virtual bool SetOption( const std::string& name, const std::string& value ) { return false; }
  19. virtual bool TryGetOption( const std::string& name, std::string& value ) { return false; }
  20.  
  21. template<typename T> T GetOption( const std::string& name ) {
  22. T res = T();
  23. bool is_ok = this->TryGetOption( name, res );
  24. assert( is_ok );
  25. return res;
  26. }
  27. };
  28.  
  29. template<typename T>
  30. struct CObj : public IObj {
  31. //------ Подход 1 ----------------------------------------------
  32. struct ExtraOptions : public IObj::ExtraOptionsBase {
  33. T Param1;
  34. T Param2;
  35.  
  36. T* getField( const std::string& name ) {
  37. if( name == "Param1" )
  38. return &this->Param1;
  39. if( name == "Param2" )
  40. return &this->Param2;
  41. return 0;
  42. }
  43. } Data;
  44.  
  45. virtual ExtraOptions& GetEO() { return this->Data; }
  46. virtual void SetEO( ExtraOptions& ed ) { this->Data = ed; }
  47. virtual void SetEO( ExtraOptionsBase& ed ) { this->Data = dynamic_cast<ExtraOptions&>(ed); }
  48.  
  49. //------ Подход 2 ----------------------------------------------
  50. virtual bool SetOption( const std::string& name, const T& value ) {
  51. T* field = this->Data.getField( name );
  52. if( field ) {
  53. *field = value;
  54. return true;
  55. }
  56. return false;
  57. }
  58.  
  59. virtual bool TryGetOption( const std::string& name, T& value ) {
  60. T* field = this->Data.getField( name );
  61. if( field ) {
  62. value = *field;
  63. return true;
  64. }
  65. return false;
  66. }
  67. };
  68.  
  69.  
  70. using namespace std;
  71.  
  72. int main() {
  73.  
  74. std::map<std::string, int> pi = {
  75. { "Param1", 5 },
  76. { "Param2", 10 },
  77. };
  78. CObj<int> oi1, oi2;
  79. for( auto i = pi.begin(); i != pi.end(); ++i )
  80. oi1.SetOption( i->first, i->second );
  81. oi2.SetEO( oi1.GetEO() );
  82. std::cout << oi2.GetEO().Param1 << " " << oi2.GetOption<int>( "Param2" ) << std::endl;
  83.  
  84. std::map<std::string, std::string> ps = {
  85. { "Param1", "Hello" },
  86. { "Param2", "world!" },
  87. };
  88. CObj<std::string> os1;
  89. for( auto i = ps.begin(); i != ps.end(); ++i )
  90. os1.SetOption( i->first, i->second );
  91. std::cout << os1.GetEO().Param1 << " " << os1.GetOption<std::string>( "Param2" ) << std::endl;
  92.  
  93.  
  94.  
  95. // your code goes here
  96. return 0;
  97. }
Success #stdin #stdout 0s 4352KB
stdin
Standard input is empty
stdout
5 10
Hello world!