Me gustaría asignar una cadena a las funciones de un miembro de instancia y almacenar cada asignación en el mapa.Guardar punteros a la función de miembro en el mapa
¿Cuál es la forma limpia de hacer algo como eso?
class MyClass
{
//........
virtual double GetX();
virtual double GetSomethingElse();
virtual double GetT();
virtual double GetRR();
//........
};
class Processor
{
private:
typedef double (MyClass::*MemFuncGetter)();
static map<std::string, MemFuncGetter> descrToFuncMap;
public:
static void Initialize();
void Process(Myclass m, string);
};
void Processor::Initialize()
{
descrToFuncMap["X"]=&MyClass::GetX;
descrToFuncMap["SomethingElse"]=&MyClass::GetSomethingElse;
descrToFuncMap["RR"]=&MyClass::GetRR;
descrToFuncMap["T"]=&MyClass::GetT;
};
void Processor::Process(MyClass ms, const std::string& key)
{
map<std::string, Getter>::iterator found=descrToFuncMap.find(key);
if(found!=descrToFuncMap.end())
{
MemFuncGetter memFunc=found->second;
double dResult=(ms).*memFunc();
std::cout<<"Command="<<key<<", and result="<<result<<std::end;
}
}
avísame si ves un problema con este enfoque y cuáles son los modismos comunes para eso?
Tal vez, debería usar si-else-if cadena de declaración, dado que tengo un número limitado de funciones miembro, en lugar de un mapa confuso de punteros func
Por cierto, he encontrado algunos de los útiles información aquí, en el c++-faq-lite
En realidad, creo que el mapa es más bonito que una cadena if-else. Le da un buen gancho para almacenar otra metainformación más adelante si surge la necesidad: simplemente expanda el tipo de valor del puntero a una estructura que contenga un puntero a la función más cualquier otra información que necesite. –
Acepto, se ve mejor, aunque es más difícil de entender para un desarrollador menos experimentado. –