I’d like to map string to an instance member functions, and store each mapping in the map.
What is the clean way of doing something like that?
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; } }
let me know if you see a problem with this approach and what are common idioms for that?
Perhaps, I should use if-else-if statement chain, given that I have a limited number of member functions, instead of a confusing map of func pointers
BTW, I found some of the useful info here in the c++-faq-lite
Looks fine to me, but for the fact that
descrToFuncMapneeds to be declaredstaticif you intend to initialise it from inside the static functionInitialize().If you want to make sure that
Initialize()gets called, and gets called just once, you can use the Singleton pattern. Basically, if you aren’t doing multithreading, that just means wrappingdescrToFuncMapinside its own class (called sayFuncMap) with a private constructor that callsInitialize(). Then you add astaticlocal variable of typeFuncMaptoProcessor::Process()— because the variable isstatic, it persists and is only initialised once.Example code (I now realise that
friendisn’t really necessary here):This is not the ‘true’ Singleton pattern as different functions could create their own, separate instances of
FuncMap, but it’s enough for what you need. For ‘true’ Singleton, you would declareFuncMap‘s constructor private and add a static method, saygetInstance(), which defined the one-and-only instance as astaticvariable and returned a reference to that.Processor::Process()would then use this with