2016-05-25 2 views
3
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é.

+0

Il y a beaucoup de cas à considérer pour déduire le type d'argument. –

+0

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é. –

Répondre

1

J'utilise habituellement du code comme this (GPL-3 sous licence) traits de fonction pour le faire:

template <typename F> 
using first_argument_type_t = 
    typename sharemind::FunctionTraits<F>::template argument<0u>::type; 

Mais il y a aussi l'alternative Boost function_traits, ce qui pourrait être utile.