J'ai une classe qui a un vecteur d'un autre objet de classe en tant que membre. Dans de nombreuses fonctions de cette classe que je dois faire même opération sur tous les objets du vecteur:Itérer sur les fonctions vectorielles et appelantes
class Small
{
public:
void foo();
void bar(int x);
// and many more functions
};
class Big
{
public:
void foo()
{
for (size_t i = 0; i < VectorOfSmalls.size(); i++)
VectorOfSmalls[i]->foo();
}
void bar(int x)
{
for (size_t i = 0; i < VectorOfSmalls.size(); i++)
VectorOfSmalls[i]->bar(x);
}
// and many more functions
private:
vector<Small*> VectorOfSmalls;
};
Je veux simplifier le code, et trouver un moyen de ne pas dupliquer aller autre vecteur dans toutes les fonctions.
J'ai envisagé de créer une fonction qui reçoit un pointeur sur la fonction, et appelle la fonction pointée sur chaque membre d'un vecteur. Mais je ne suis pas sûr que l'utilisation de pointeurs vers des fonctions en C++ soit une bonne idée.
J'ai aussi pensé aux foncteurs et au functionoids, mais ça va me forcer à créer une classe pour chaque fonction et ça sonne comme une overkill.
Une autre solution possible est de créer une fonction qui reçoit une chaîne, et appelle la commande en fonction de la chaîne:
void Big::call_command(const string & command)
{
for (size_t i = 0; i < VectorOfSmalls.size(); i++)
{
if (command == "foo")
VectorOfSmalls[i]->foo();
else if (command == "bar")
VectorOfSmalls[i]->bar();
}
}
void Big::foo()
{
call_command("foo");
}
Mais il pourrait travailler lent (création inutile d'une chaîne au lieu d'un appel de fonction) et crée également un problème si les fonctions ont une signature différente.
Alors, que recommanderiez-vous? Est-ce que je devrais laisser tout le même comme c'est maintenant?
EDIT: Je ne peux utiliser que STL et pas boost (anciens compilateurs).
Merci Evan. Mais std :: mem_fn fait partie de boost et pas de STL. Peut-être qu'il y a une autre façon d'utiliser for_each dans mon cas? Et qu'en est-il des fonctions avec des signatures différentes? –
oops, typo: mem_fn fait partie de boost, cependant std :: mem_fun fait partie de la STL. –
comme pour les fonctions avec des signatures différentes, vous pouvez probablement utiliser quelques fonctions de modèle pour couvrir toutes les possibilités. –