#include <iostream> #include <map> using namespace std; class Type { public: Type() {} virtual void setValue(std::string val) = 0; }; class Integer : public Type { public: Integer() : Type() { value = 0; } virtual void setValue(std::string val) { value = stoi(val); } int value; }; class String : public Type { public: String() : Type() { } virtual void setValue(std::string val) { value = val; } string value; }; class A { public: A() { }; static map<string, Type* A::*> getDataBindings() { map<string, Type* A::*> datas; datas["name"] = &A::p_name; datas["age"] = &A::p_age; } Integer p_age; String p_name; }; int main() { // here I can store my data bindings once and for all, avoiding to call // getDataBindings for each object of class A. map<string, Type* A::*> dataBindingsForA = A::getDataBindings(); A a1, a2, a3, a4, a5; // here you could say "use p_name/p_age directly" but in my use case i need // to bind the variables to actual names (think SQL) a1.*dataBindingsForA["name"]->setValue("John Doe 1"); a1.*dataBindingsForA["age"]->setValue("10"); a2.*dataBindingsForA["name"]->setValue("John Doe 2"); a2.*dataBindingsForA["age"]->setValue("20"); a3.*dataBindingsForA["name"]->setValue("John Doe 3"); a3.*dataBindingsForA["age"]->setValue("30"); a4.*dataBindingsForA["name"]->setValue("John Doe 4"); a4.*dataBindingsForA["age"]->setValue("40"); a5.*dataBindingsForA["name"]->setValue("John Doe 5"); a5.*dataBindingsForA["age"]->setValue("50"); return 0; }
Standard input is empty
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");
^
Standard output is empty