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é.
Je suis d'accord, regarde mieux, bien que plus difficile à comprendre pour moins d'un développeur expérimenté.
OriginalL'auteur | 2009-03-10
Vous devez vous connecter pour publier un commentaire.
Semble bien pour moi, mais pour le fait que
descrToFuncMap
doit être déclaréstatic
si vous avez l'intention de l'initialiser à partir de l'intérieur de la fonction statiqueInitialize()
.Si vous voulez vous assurer que
Initialize()
est appelée, et est appelée qu'une fois, vous pouvez utiliser le pattern Singleton. En gros, si vous ne faites pas le multithreading, qui signifie que tout emballagedescrToFuncMap
à l'intérieur de sa propre classe (appelée direFuncMap
) avec un constructeur privé qui appelleInitialize()
. Ensuite, vous ajoutez unstatic
variable locale de typeFuncMap
àProcessor::Process()
-- parce que la variable eststatic
, il persiste et n'est initialisé une fois.Exemple de code (je me rends compte maintenant que
friend
n'est pas vraiment nécessaire ici):Ce n'est pas le "vrai" pattern Singleton comme les diverses fonctions pourraient créer leur propre, distincte des instances de
FuncMap
, mais c'est assez pour ce que vous avez besoin. Pour les "vrais" Singleton, vous pouvez déclarer desFuncMap
'constructeur privé et ajouter une méthode statique, diregetInstance()
, qui a défini le seul et unique instance comme unstatic
variable et est retourné référence à cela.Processor::Process()
serait alors l'utiliser avecOriginalL'auteur j_random_hacker
Je changerais
à
Ne vois pas de mauvais effet de côté pour l'instant. Probablement avec boost::function comme une valeur de la carte, il sera plus facile à l'avenir.
Les cartes sont ok pour moi.
OriginalL'auteur Mykola Golubyev
Éviter l'utilisation de "virtuel" si vous utilisez des cartes de pointeurs de fonction. Dans ce contexte, à l'aide de "virtuel" mot-clé ne va pas aider beaucoup. Par exemple
sera toujours appeler 'Maclasse::GetX fonction, même si GetX est remplacée par la classe dérivée de MyClass.
Habituellement, vous n'aurez pas grand nombre de fonctions dans la classe, plutôt que d'utiliser la carte, vous pouvez créer simple struct tableau et utiliser une boucle for. Si le nombre de fonctions sont de petite taille, il n'y aura pas une grosse différence de performances de la carte et le tableau. Quelque chose de similaire au code ci-dessous
OriginalL'auteur Nitin Bhide