Я собираюсь пойти против течения здесь.
В C указатели на функции - единственный способ реализовать настройку, потому что нет объектно-ориентированного программирования.
В 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 ++.