Ich möchte String zu einer Instanz Member-Funktionen zuordnen, und speichern Sie jede Zuordnung in der Karte.Store Zeiger auf Member-Funktion in der Karte
Was ist die saubere Art, so etwas zu tun?
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;
}
}
lassen Sie mich wissen, wenn Sie ein Problem mit diesem Ansatz sehen und was sind die gängigen Idiome dafür?
Vielleicht sollte ich if-else-if-Anweisung Kette, da ich eine begrenzte Anzahl von Elementfunktionen haben, statt einer verwirrenden Karte von func Zeiger
BTW, ich einige der nützlichen gefunden hier Informationen im c++-faq-lite
Eigentlich denke ich, die Karte ist schöner als eine Wenn-sonst-Kette. Es gibt Ihnen einen schönen Haken für das Speichern anderer Meta-Informationen, wenn es nötig ist - erweitern Sie einfach den Werttyp vom Funktionszeiger zu einer Struktur, die einen Funktionszeiger enthält und welche anderen Informationen Sie auch brauchen. –
Ich stimme zu, sieht besser aus, obwohl es für einen weniger erfahrenen Entwickler schwieriger zu verstehen ist. –