¿Hay una manera de deducir el valor de un parámetro de plantilla de puntero de función?

C ++ permite que los parámetros de plantilla que no son de tipo sean de puntero, incluido el puntero de función, tipo. Recientemente le pregunté a unpregunta sobre para qué sirve esto, y esto es un seguimiento deuna de las respuestas.

¿Es posible deducir lavalor de un parámetro de plantilla de puntero de función, de un argumento de función que es el puntero de función en cuestión? Por ejemplo:

using VoidFunction = void(*)();

template <VoidFunction F>
void templ(VoidFunction);

...

void func();  // a VoidFunction

...

templ<func>(func);  // works, but I have to specify the template parameter explicitly
templ(func);        //  <-- I would like to be able to do this

¿Hay alguna manera de hacer que esta deducción suceda? Parece técnicamente posible desde el punto de vista del implementador de un compilador, siempre que el argumento de la función se pueda resolver en una función en el código en el momento de la compilación.

Si se está preguntando acerca de la motivación detrás de esto, vea los comentarios enesta respuesta, en particular una posible optimización para la implementación destd::bind().

EDITAR: Me doy cuenta de que simplemente podría eliminar el argumento de la función y usar el argumento de la plantilla, como entempl<func>(). Mi único propósito de agregar el argumento de la función era tratar de evitar tener que pasar el argumento de la plantilla.

Supongo que lo que realmente quiero, es también deducir eltipo de la función de puntero, como en:

template <typename Function, Function F>
void templ(/* something */);

y luego ser capaz de llamar

templ(func);

o

templ<func>();

y hacer que tanto el tipo como el valor se deduzcan de una sola mención del puntero de función.

Espero que tenga más sentido ahora.

Respuestas a la pregunta(1)

Su respuesta a la pregunta