Stocker des pointeurs vers une fonction membre dans la carte

J'aimerais carte de chaîne à un membre de l'instance fonctions, et de les stocker chaque cartographie de la carte.

Ce qui est le propre façon de faire quelque chose comme ça?

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;      
      }
 }  

laissez-moi savoir si vous voyez un problème avec cette approche et ce sont des expressions communes pour qui?

Peut-être, je devrais utiliser si-sinon-si la déclaration de la chaîne, étant donné que j'ai un nombre limité de fonctions de membre, au lieu d'une confusion carte de func pointeurs

BTW, j'ai trouvé certaines des informations utiles ici dans le c++faq lite

En fait, je pense que la carte est plus agréable qu'un if-else de la chaîne. Il vous donne un bon crochet pour stocker d'autres méta-informations plus tard si le besoin s'en fait sentir -- étendre le type de la valeur de la fonction pointeur vers une structure contenant un pointeur de fonction en plus de toutes les informations dont vous avez besoin.
Je suis d'accord, regarde mieux, bien que plus difficile à comprendre pour moins d'un développeur expérimenté.

OriginalL'auteur | 2009-03-10