Especialização em modelos de função em ponteiros de função

Eu tenho uma função de sanitização que eu quero executar somente em tipos de ponteiro (tradicional).

Meu problema é com modelos de função que eu posso chegar a limitar a função a ponteiros apenas, no entanto, por causa de diferenças de regra de elenco entre ponteiros de função e ponteiros regulares, me deparo com problemas.

oSanitize() A função precisa ser executada em uma grande quantidade de tipos, alguns dos quais são ponteiros e precisam ser sanitizados, outros dos quais são ponteiros de função de tipos variados de aridade e de parâmetro e não devem ser higienizados, e alguns deles são tipos de dados não apontadores. que também não deve ser higienizado.

Alguma coisa óbvia, estou perdendo?

  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;
  }

questionAnswers(5)

yourAnswerToTheQuestion