Я збираюся піти проти течії тут.
У 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;
Але оскільки варіативні шаблони та лямбда вже не за горами, я не впевнений, що ми будемо довго використовувати вказівники на функції у чистому коді С ++.