Pour des raisons de performances, j'utilise le Curiously Reoccuring Template Pattern pour éviter les fonctions virtuelles. J'ai beaucoup de petites commandes qui s'exécutent des millions de fois. J'essaye d'adapter ceci dans le modèle de commande. Je veux ajouter des tonnes de commandes à une file d'attente, puis les parcourir en les exécutant une par une. Chaque commande utilise un CRTP pour éviter les fonctions virtuelles. Le problème que je rencontre est que le modèle de commande est généralement mis en œuvre en utilisant un vecteur de pointeurs. Mais lorsque la classe Command est modélisée, il devient difficile de passer des pointeurs de commande génériques. Je ne suis pas un expert en C++, alors peut-être existe-t-il un moyen évident de stocker un vecteur d'objets de commande basés sur un modèle? J'ai essayé d'utiliser quelque chose comme:Motif de commande sans fonctions virtuelles (C++)
boost:ptr_vector commands;
AddCommand(Command* command) {
commands.push_back(command);
}
Le problème est Command
est pas un type, donc Command* command
donne une erreur de compilation. Je dois utiliser Command<CommandType>
, mais cela ne fonctionnera pas car j'ai besoin de la file d'attente pour contenir différents types de commandes.
Des idées de solutions? Ou les fonctions virtuelles sont-elles ma seule option?
AJOUT: Les objets de commande font partie d'un algorithme de simulation Monte Carlo. Donc, vous pourriez avoir, Command être un nombre aléatoire d'une distribution normale, où les paramètres de la distribution normale font partie de la classe. Donc, le modèle de commande s'adapte très bien. J'ai beaucoup d'appels, dans un ordre particulier, à des fonctions qui doivent maintenir l'état.
Un exemple de vos commandes serait utile. Si vous avez un tas de petites classes de modèles de commande, afficher 1 ou 2 comme exemples dans votre peut aider les gens à suggérer des alternatives. À tout le moins, cela améliorera la compréhension de la question pour les futurs lecteurs. –
Pourriez-vous également fournir plus d'informations sur le scénario spécifique que vous utilisez le modèle de commande à résoudre? En outre, expliquez pourquoi vous pensez que les fonctions virtuelles sont trop lentes. L'avez-vous implémenté en utilisant des fonctions virtuelles et vous l'avez trouvé trop lent? –