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?
Detesto le conversioni implicite :( –
* "(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++). –
@ChristianRau 'std :: is_function' è uno dei tratti principali della classificazione. 'is_callable' o qualcosa del genere servirebbe per uno scopo completamente diverso. –