0
I would like to be able to assign and/or retrieve values of an object through another class, where I can declare which properties I would like to access, their types, the method to access the private attribute value and the method to assign the value.
I would like to store in a hash the name of the property and the methods to manipulate the value, in this way I could use generic class values by other entities, but I do not know if it is possible (I imagine so), and I do not know how to do.
The code below is not functional, it was based on an attempt I was making to try to implement a solution. Of the error can example of:
error: no matching function for call to 'Test<unsigned int>::Test(C&, const char [2], unsigned int (C::*)() const, void (C::*)(unsigned int))'
auto t1 = new Test<unsigned int>(c, "a", &C::getA, &C::setA);
Below the code snippet
#include <string>
#include <map>
class C {
public:
unsigned int getA() const {
return a;
}
void setA(unsigned int value) {
C::a = value;
}
const std::string &getB() {
return b;
}
void setB(const std::string &value) {
C::b = value;
}
private:
unsigned int a;
std::string b;
};
template<typename T>
class Test {
public:
Test(T t, const std::string attribute, const T (*getter)(), void (*setter)(T)) : t(t), attribute(attribute),
getter(getter), setter(setter) {}
const std::string &getAttribute() const {
return attribute;
}
private:
T t;
std::string attribute;
const T (*getter)();
void (*setter)(T t);
};
int main(int argc, char **argv) {
C c;
auto t1 = new Test<unsigned int>(c, "a", &C::getA, &C::setA);
auto t2 = new Test<std::string>(c, "b", &C::getB, &C::setB);
std::map<std::string, std::string *> map;
map.insert({t1.getAttribute, t1});
map.insert({t2.getAttribute, t2});
}
So basically I have two questions is it possible to do this? if yes, how?
In this context for example if I needed to retrieve the value of "a" (variable) t1, I would like to go to the map and use the getter function pointer of the Test class