fork download
  1. #include <iostream>
  2. #include <map>
  3.  
  4. using namespace std;
  5.  
  6. class Type
  7. {
  8. public:
  9. Type() {}
  10.  
  11. virtual void setValue(std::string val) = 0;
  12. };
  13.  
  14. class Integer : public Type
  15. {
  16. public:
  17. Integer() : Type() { value = 0; }
  18. virtual void setValue(std::string val) {
  19. value = stoi(val);
  20. }
  21. int value;
  22. };
  23.  
  24. class String : public Type
  25. {
  26. public:
  27. String() : Type() { }
  28. virtual void setValue(std::string val) {
  29. value = val;
  30. }
  31. string value;
  32. };
  33.  
  34. class A
  35. {
  36. public:
  37. A() { };
  38.  
  39. static map<string, Type* A::*> getDataBindings() {
  40. map<string, Type* A::*> datas;
  41. datas["name"] = &A::p_name;
  42. datas["age"] = &A::p_age;
  43. }
  44.  
  45. Integer p_age;
  46. String p_name;
  47. };
  48.  
  49. int main()
  50. {
  51. // here I can store my data bindings once and for all, avoiding to call
  52. // getDataBindings for each object of class A.
  53. map<string, Type* A::*> dataBindingsForA = A::getDataBindings();
  54.  
  55. A a1, a2, a3, a4, a5;
  56.  
  57. // here you could say "use p_name/p_age directly" but in my use case i need
  58. // to bind the variables to actual names (think SQL)
  59. a1.*dataBindingsForA["name"]->setValue("John Doe 1");
  60. a1.*dataBindingsForA["age"]->setValue("10");
  61.  
  62. a2.*dataBindingsForA["name"]->setValue("John Doe 2");
  63. a2.*dataBindingsForA["age"]->setValue("20");
  64.  
  65. a3.*dataBindingsForA["name"]->setValue("John Doe 3");
  66. a3.*dataBindingsForA["age"]->setValue("30");
  67.  
  68. a4.*dataBindingsForA["name"]->setValue("John Doe 4");
  69. a4.*dataBindingsForA["age"]->setValue("40");
  70.  
  71. a5.*dataBindingsForA["name"]->setValue("John Doe 5");
  72. a5.*dataBindingsForA["age"]->setValue("50");
  73.  
  74. return 0;
  75. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp: In static member function 'static std::map<std::basic_string<char>, Type* A::*> A::getDataBindings()':
prog.cpp:41:23: error: cannot convert 'String A::*' to 'std::map<std::basic_string<char>, Type* A::*>::mapped_type {aka Type* A::*}' in assignment
         datas["name"] = &A::p_name;
                       ^
prog.cpp:42:22: error: cannot convert 'Integer A::*' to 'std::map<std::basic_string<char>, Type* A::*>::mapped_type {aka Type* A::*}' in assignment
         datas["age"] = &A::p_age;
                      ^
prog.cpp: In function 'int main()':
prog.cpp:59:33: error: base operand of '->' is not a pointer
     a1.*dataBindingsForA["name"]->setValue("John Doe 1");
                                 ^
prog.cpp:60:32: error: base operand of '->' is not a pointer
     a1.*dataBindingsForA["age"]->setValue("10");
                                ^
prog.cpp:62:33: error: base operand of '->' is not a pointer
     a2.*dataBindingsForA["name"]->setValue("John Doe 2");
                                 ^
prog.cpp:63:32: error: base operand of '->' is not a pointer
     a2.*dataBindingsForA["age"]->setValue("20");
                                ^
prog.cpp:65:33: error: base operand of '->' is not a pointer
     a3.*dataBindingsForA["name"]->setValue("John Doe 3");
                                 ^
prog.cpp:66:32: error: base operand of '->' is not a pointer
     a3.*dataBindingsForA["age"]->setValue("30");
                                ^
prog.cpp:68:33: error: base operand of '->' is not a pointer
     a4.*dataBindingsForA["name"]->setValue("John Doe 4");
                                 ^
prog.cpp:69:32: error: base operand of '->' is not a pointer
     a4.*dataBindingsForA["age"]->setValue("40");
                                ^
prog.cpp:71:33: error: base operand of '->' is not a pointer
     a5.*dataBindingsForA["name"]->setValue("John Doe 5");
                                 ^
prog.cpp:72:32: error: base operand of '->' is not a pointer
     a5.*dataBindingsForA["age"]->setValue("50");
                                ^
stdout
Standard output is empty