Я собираюсь пойти против течения здесь.
В C указатели на функции являются единственным способом реализации настройки, поскольку OO отсутствует.
В C ++ вы можете использовать либо указатели функций, либо функторы (функциональные объекты) для одного и того же результата.
Функторы имеют ряд преимуществ по сравнению с необработанными указателями на функции из-за их природы объекта, а именно:
- Они могут представлять несколько перегрузок
operator()
- Они могут иметь состояние / ссылку на существующие переменные
- Их можно построить на месте (
lambda
и bind
)
Лично я предпочитаю, чтобы функторы указателей на функции (несмотря на шаблонный код), главным образом потому, что синтаксис для указателей на функции может легко запутаться (из Обучающего указателя функций ):
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
Единственный раз, когда я видел указатели на функции, где функторы не могли быть, были в Boost.Spirit. Они совершенно неправильно использовали синтаксис для передачи произвольного числа параметров в качестве одного параметра шаблона.
typedef SpecialClass<float(float,float)> class_type;
Но так как вариационные шаблоны и лямбды не за горами, я не уверен, что мы будем долго использовать указатели на функции в чистом коде C ++.