J'ai déjà demandé a similar question here, mais je n'ai pas vraiment eu la réponse que je voulais parce que ma question était mal formulée et les exemples étaient mauvais. Donc, je donne un autre coup de feu, avec une meilleure explication et un meilleur code.Mélanger le modèle de commande, le modèle d'usine et les modèles tous ensemble ...
Le code ci-dessous a été retiré des détails inutiles mais cela fonctionne. La chose est que je voudrais utiliser la déduction d'argument de modèle, si possible, pour simplifier l'appel de fonction de modèle.
J'ai une usine qui crée des commandes. Pour créer une commande, j'utilise un appel comme celui-là:
mCommandFactory.createCommand<
DoSomeStuff,
ParameterType1,
ParameterType2,
ParameterType3,
ParameterType4
>
(std:string("some description"),
parameter1,
parameter2,
parameter3,
parameter4);
Comme vous l'avez sans doute deviné, le type de paramètre1 est ParameterType1, et ainsi de suite ....
Maintenant, si nous regardons la définition de la commande - DoSomeStuff- lui-même:
class DoSomeStuff : public UndoableCommand< ParameterType1 , ParameterType2, ParameterType3 , ParameterType4 >
{
public:
DoSomeStuff(... /* arguments which are needed for precessing the command and undoing it*/);
~DoSomeStuff() throw();
void executeImpl();
void undoImpl();
protected:
... /* members which are needed for precessing the command and undoing it*/
};
Comme vous pouvez le voir, l'information ParameterTypeN est déjà à l'intérieur déclaration DoSomeStuff.
Je me demandais s'il était possible d'une certaine manière de remplacer l'appel CreateCommand ci-dessus par quelque chose de plus simple:
mCommandFactory.createCommand<DoSomeStuff>
(std:string("some description"),
parameter1,
parameter2,
parameter3,
parameter4);
Voici le code CommandFactory:
class CommandFactory
{
private:
// some stuff used to initialize objects created by this factory
public:
CommandFactory(...) : ... /* members initialization */
{
}
template <class CommandType, typename P1, typename P2, typename P3, typename P4>
void createCommand(juce::String& description,P1 p1, P2 p2, P3 p3, P4 p4)
{
Undoable* cmdPtr = new CommandType(p1, p2, p3, p4);
...
// init cmdPtr
(*cmdPtr)();
}
Fondamentalement, le point serait de déplacer la complexité dans CommandFactory, pour garder le "code client" (l'appel à createCommand) aussi simple et court que possible.
Des idées?
Je ne suis pas sûr ... J'utilise beaucoup bind & functions dans le reste du code, mais pour la liaison dynamique. Ici, tout est connu au moment de la compilation. Peut-être que je néglige complètement votre point. J'ai besoin d'un exemple simple pour voir comment vous utiliseriez des foncteurs pour résoudre ce problème particulier ... – Dinaiz