Eu vou contra a corrente aqui.
Em C, os ponteiros de função são a única maneira de implementar a personalização, porque não há OO.
Em C ++, você pode usar ponteiros de função ou functores (objetos de função) para o mesmo resultado.
Os functores têm uma série de vantagens sobre os ponteiros de função bruta, devido à sua natureza de objeto, notavelmente:
- Eles podem apresentar várias sobrecargas do
operator()
- Eles podem ter estado / referência a variáveis existentes
- Eles podem ser construídos no local (
lambda
e bind
)
Eu pessoalmente prefiro functores do que ponteiros de função (apesar do código clichê), principalmente porque a sintaxe para ponteiros de função pode facilmente ficar complicada (do Tutorial de ponteiro de função ):
typedef float(*pt2Func)(float, float);
// defines a symbol pt2Func, pointer to a (float, float) -> float function
typedef int (TMyClass::*pt2Member)(float, char, char);
// defines a symbol pt2Member, pointer to a (float, char, char) -> int function
// belonging to the class TMyClass
A única vez que vi ponteiros de função usados onde functores não podiam foi em Boost.Spirit. Eles abusaram totalmente da sintaxe para passar um número arbitrário de parâmetros como um único parâmetro de modelo.
typedef SpecialClass<float(float,float)> class_type;
Mas como os modelos variados e lambdas estão chegando, não tenho certeza se usaremos ponteiros de função em código C ++ puro por muito tempo.