Je cherche les règles impliquant le passage des fonctions de modèles C ++ comme arguments.
Ceci est pris en charge par C ++ comme le montre un exemple ici:
#include <iostream>
void add1(int &v)
{
v+=1;
}
void add2(int &v)
{
v+=2;
}
template <void (*T)(int &)>
void doOperation()
{
int temp=0;
T(temp);
std::cout << "Result is " << temp << std::endl;
}
int main()
{
doOperation<add1>();
doOperation<add2>();
}
Il est cependant difficile d'apprendre à connaître cette technique. La recherche de "fonction comme argument de modèle" ne mène pas à grand-chose. Et les modèles C ++ classiques Le guide complet ne l'étonnent pas non plus (du moins pas de ma recherche).
Les questions que je me pose sont de savoir s'il s'agit d'un C ++ valide (ou simplement d'une extension largement prise en charge).
De plus, existe-t-il un moyen de permettre à un foncteur avec la même signature d'être utilisé de manière interchangeable avec des fonctions explicites pendant ce type d'invocation de modèle?
Ce qui suit ne fonctionne pas dans le programme ci-dessus, au moins dans Visual C ++ , car la syntaxe est évidemment incorrecte. Ce serait bien de pouvoir désactiver une fonction pour un foncteur et vice versa, de la même manière que vous pouvez passer un pointeur de fonction ou un foncteur à l'algorithme std :: sort si vous souhaitez définir une opération de comparaison personnalisée.
struct add3 {
void operator() (int &v) {v+=3;}
};
...
doOperation<add3>();
Des pointeurs vers un ou deux liens Web ou une page du livre des modèles C ++ seraient appréciés!
-std=gnu++17
. Puis-je utiliser le résultat d'un opérateur de conversion lambda constexpr sans capture C ++ 17 comme argument de non-type de modèle de pointeur de fonction? .