Especialización de plantilla de función en punteros de función

Tengo una función de saneamiento que quiero ejecutar solo en tipos de punteros (tradicionales).

Mi problema es con las plantillas de función que puedo llegar a limitar la función solo a los punteros, sin embargo, debido a las diferencias de regla de conversión entre los punteros a la función y los punteros regulares, me encuentro con problemas.

losSanitize() la función debe ejecutarse contra una gran cantidad de tipos, algunos de los cuales son punteros y deben ser desinfectados, otros son punteros de función de aridad variable y tipos de parámetros y no deben ser desinfectados, y algunos son tipos de datos que no son punteros Que tampoco debe ser saneado.

¿Algo obvio que me esté perdiendo?

  template<typename T>
  T* Sanitize(T* value)
  {
     return (T*)SanitizePointer(value);  //SanitizePointer returns void*, so cast is necessary
  }

  template<typename T>
  T Sanitize(T value)
  {
     return value;  //Non-pointers can be passed without sanitization
  }

  int main()
  {

     int  a;
     int* b;
     int (*c)();

     Sanitize(a);
     Sanitize(b);
     Sanitize(c);   //<- ERROR

     return 0;
  }

Respuestas a la pregunta(5)

Su respuesta a la pregunta