2013-05-06 19 views
9

sto passando un puntatore a funzione in una funzione di modello:std :: is_function non riconosce argomento di un template in funzione

int f(int a) { return a+1; } 

template<typename F> 
void use(F f) { 
    static_assert(std::is_function<F>::value, "Function required"); 
} 

int main() { 
    use(&f); // Plain f does not work either. 
} 

Ma l'argomento modello F non viene riconosciuto dal is_function essere una funzione e la statica l'asserzione fallisce. Il messaggio di errore del compilatore indica che F è int(*)(int) che è un puntatore alla funzione. Perché si comporta in questo modo? Come posso riconoscere la funzione o il puntatore per funzionare in questo caso?

risposta

12

F è un puntatore di funzionare (indipendentemente dal fatto che si passa f o &f). Quindi rimuovere il puntatore:

std::is_function<typename std::remove_pointer<F>::type>::value 

(Ironia della sorte, std::is_function<std::function<FT>> == false ;-))

+2

Detesto le conversioni implicite :( –

+5

* "(Ironia della sorte,' std :: is_function > == false ';-))" * - Forse per gli standard futuri un 'std :: is_callable' potrebbe essere una buona idea, dal momento che' std :: is_function' non funziona nemmeno per lambdas, solo semplici funzioni (e le volte in cui ogni callable era una funzione è ben presente nel moderno C++). –

+0

@ChristianRau 'std :: is_function' è uno dei tratti principali della classificazione. 'is_callable' o qualcosa del genere servirebbe per uno scopo completamente diverso. –

Problemi correlati