Salut les agrumes !
J'ai un petit soucis avec C++ qui commence à m'embêter, et je me demandais si quelqu'un avait une solution élégante pour le résoudre.
L'idée est de créer un genre de décorateur (pour le pythonistes) ou bien de fonction wrapper pour augmenter le comportement d'un morceau de code spécifique. Pour l'illustration, disons que je veux pouvoir afficher le résultat d'une fonction de double
vers double
. Pour ça, pas de problème, je peux simplement faire :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <iostream> #include <functional> #include <cstdlib> using namespace std; void PrintUnary(function<double(double)> F, double arg){ cout << F(arg) << endl; } int main(void){ PrintUnary([] (double arg) -> double {return arg + 1;}, 3); return EXIT_SUCCESS; } |
En revanche, si j'essaie de résoudre le problème en utilisant des templates, impossible de compiler. Si je déclare :
1 2 3 4 | template<function<double(double)> F> void PrintUnary(double arg){ cout << F(arg) << endl; } |
Le compilateur me dit que function<double(double)>
n'est pas un type convenable pour ma fonction template.
Et si j'essaie de déclarer ça "à la C" :
1 2 3 4 5 6 7 8 9 | template<double(*F)(double)> void PrintUnary(double arg){ cout << F(arg) << endl; } int main(void){ PrintUnary<[] (double arg) -> double {return arg + 1;}>(3.); return EXIT_SUCCESS; } |
Cette fois-ci c'est le type de la lambda-expression du main qui n'est pas compatible avec le type de ma fonction template.
Ma question est donc : n'y a-t-il aucun moyen en C++ de paramétrer du code avec une valeur fonctionnelle et en utilisant les templates ? Je trouve ça bizarre que ces deux notions très importantes de C++ ne soient pas compatibles.