J'utilise des templates C++ pour passer dans les foncteurs Strategy pour changer le comportement de ma fonction. Ça fonctionne bien. Le foncteur que je passe est une classe sans état sans stockage et surcharge juste l'opérateur() de la manière classique des foncteurs.Classe Functor travaillant dans le constructeur
template <typename Operation> int foo(int a)
{
int b=Operation()(a);
/* use b here, etc */
}
Je le fais souvent, et il fonctionne bien, et souvent je fais des modèles avec 6 ou 7 foncteurs templated passé en!
Cependant, je m'inquiète à la fois de l'élégance du code et de l'efficacité. Le foncteur est sans état, donc je suppose que le constructeur Operation() est libre et l'évaluation du foncteur est aussi efficace qu'une fonction inline, mais comme tous les programmeurs C++, j'ai toujours des doutes persistants.
Ma deuxième question est de savoir si je pourrais utiliser une autre approche des foncteurs .. celle qui ne remplace pas l'opérateur(), mais fait tout dans le constructeur comme effet secondaire! Quelque chose comme:
struct Operation {
Operation(int a, int &b) { b=a*a; }
};
template <typename Operation> int foo(int a)
{
int b;
Operation(a,b);
/* use b here, etc */
}
Je ne l'ai jamais vu quelqu'un utiliser un constructeur comme le « travail » d'un foncteur, mais il semble que cela devrait fonctionner. Y a-t-il un avantage? Un inconvénient? J'aime la suppression de l'étrange parenthèse doublée "Operator() (a)", mais c'est probablement juste esthétique.
Qui ne peut pas lancer? –
@Mykola Golubyev: Dtors - au moins, vous n'êtes pas censé jeter. – dirkgently