S'il vous plaît considérer cette -probablement mal written- exemple:Quelle est la meilleure façon d'avoir un nombre variable de paramètres de modèle?
class Command;
class Command : public boost::enable_shared_from_this<Command>
{
public :
void execute()
{
executeImpl();
// then do some stuff which is common to all commands ...
}
// Much more stuff ...
private:
virtual void executeImpl()=0;
// Much more stuff too ...
};
et:
class CmdAdd : public Command
{
public:
CmdAdd(int howMuchToAdd);
void executeImpl();
int _amountToAdd;
};
// implementation isn't really important here ....
Avec cela, je peux simplement ajouter un rappel à l'aide de cette syntaxe:
boost::shared_ptr<Command> cmdAdd(CmdAdd(someValue));
cmdAdd->execute();
Il fonctionne parfaitement. Ma classe "Command" fait beaucoup plus de choses qui sont communes à toutes les commandes, telles que l'annulation, le rétablissement, le rapport de progression, etc., mais je l'ai enlevé du code pour des raisons de lisibilité.
Ma question est simple: est-il un moyen de réécrire la classe de commande, afin que je puisse remplacer cet appel:
boost::shared_ptr<Command> cmdAdd(CmdAdd(someValue));
cmdAdd->execute();
par quelque chose comme:
CmdAdd(someValue); // preferably
or CmdAdd->execute(someValue)
J'ai pensé beaucoup, mais j'ai un problème conceptuel: Je voulais template ma classe de commande comme
template <typename R,typename T1, typename T2, ..., typename Tn> class Command
{
R1 execute(T1 p1, ...,Tn pn)
{
return executeImpl(T1 p1, ...,Tn pn);
// then do some stuff which is common to all commands ...
}
}
mais évidemment, il y a un problème ici: la syntaxe template <typename R,typename T1, typename T2, ..., typename Tn>
n'est pas légale C++, AFAIK.
Dois-je écrire n versions de commande, comme:
template <typename R> class Command
template <typename R,typename T1> class Command
template <typename R,typename T1, typename T2> class Command
...
et ainsi de suite? (même pas sûr que ça va fonctionner en effet)
Ou y at-il une autre façon plus élégante de le faire? La syntaxe, mentionnée here est-elle utilisée? (fonction f;)
J'ai regardé les listes de types de Loki et ils semblent faire le travail. Mais je ne trouve rien dans Boost. Je lis sur le web que boost :: mpl est ce que l'on veut utiliser pour mettre en œuvre des typelists, mais je suis un peu confus par docs MPL?
Des idées à ce sujet? Regads, D.
Très intéressé! En effet, j'ai ajouté une classe CommandBase non-template, précisément pour les conteneurs. Enregistrer/restaurer les paramètres fonctionne également parfaitement (quelques astuces). J'ai finalement choosed d'utiliser cette approche "modèle classe Command template Classe de commande template classe Command ", avec boost préprocesseur. Semble être le plus astuce, mais j'ai encore des problèmes de syntaxe. Je trouve que votre approche est beaucoup plus élégante que la mienne, alors merci beaucoup et je vais jeter un coup d'œil à ce modèle :-) –
Dinaiz