std :: is_function no reconoce el argumento de la plantilla como una función

Estoy pasando un puntero para funcionar en una plantilla de función:

int f(int a) { return a+1; } template void use(F f) { static_assert(std::is_function::value, "Function required"); } int main() { use(&f); // Plain f does not work either. } 

Pero el argumento de la plantilla F no es reconocido por is_function como una función y la aserción estática falla. El mensaje de error del comstackdor dice que F es int(*)(int) que es un puntero a la función. ¿Por qué se comporta así? ¿Cómo puedo reconocer la función o el puntero para funcionar en este caso?

F es un puntero a la función (independientemente de si pasa f o &f ). Así que quita el puntero:

 std::is_function::type>::value 

(Irónicamente, std::is_function> == false ;-))