template<typename T>
void f(void (*func)(const T&)) {
(*func)(T());
}
void func(const int& i) {
std::cout << i << std::endl;
}
int main() {
f(&func);
}
Ici l'argument modèle T (= int)
de f
est déduit automatiquement sur la base du premier argument de la fonction func
.C++ type d'argument de fonction d'utilisation pour la déduction des arguments de modèle
peut-il être également étendu à travailler avec des foncteurs généraux (fonctions lambda ou d'autres objets de fonction.) Peut-être avec une deuxième fonction, à savoir quelque chose comme
template<typename T, typename Function> void f(Function func);
template<typename Function>
void call_f(Function func) {
using arg_type = first_argument_type_t<Function>; // ???
f<arg_type, Function>(func);
}
La chute à func
en f
devrait pouvoir être inline par le compilateur, donc std::function
ne peut pas être utilisé.
Il y a beaucoup de cas à considérer pour déduire le type d'argument. –
Vous ne le ferez pas dans un cas général, c'est-à-dire, si ce foncteur est un lambda générique ou une instance de type classe avec un opérateur '()' surchargé/structuré. –