Функтор (програмування)
Фу́нкціональний об'єкт (англ. function object), функтор, об'єкт-функція — концепція в програмуванні, яка передбачає використання об'єкта класу як функції (часто зі збереженням синтаксису виклику). ВикористанняФунктори легко використовувати для написання колбеків. В С++ функтор можливо визначити явно чи використати лямбда-вираз із замиканням як анонімний функтор. Розглянемо приклад функції сортування, яка для порівняння двох елементів використовує колбек-функцію. Програма може мати такий вигляд: # include <stdlib.h>
/* колбек-функція порівняння елементів */
int compare_ints_function(void *A, void *B) {
return *((int *)(A)) < *((int *)(B));
}
…
/* С декларація функції сортування */
void sort(void *first_item, size_t item_size, void *last_item, int (*cmpfunc)(void *, void *));
…
int main(void) {
int items[] = {4, 3, 1, 2};
sort((void *)(items), sizeof(int), (void *)(items + 3), compare_ints_function);
return 0;
}
У C++ замість функції можна використати об'єкт класу в якому перевизначений оператор struct compare_class {
bool operator()(int A, int B) const { return A < B; }
};
…
// С++ декларація функції сортування
template <class ComparisonFunctor>
void sort_ints(int* begin_items, int num_items, ComparisonFunctor c);
…
int main() {
int items[] = {4, 3, 1, 2};
sort_ints(items, sizeof(items)/sizeof(items[0]), compare_class());
}
Зауваж, що синтаксис передачі колбеку в C#У C# функтори реалізовано у вигляді делегатів. Objective-CВ Objective-C об'єкт-функція створюється шляхом використання класу // створення функтора
SEL sel = @selector(buildDocument);
NSInvocation* inv = [NSInvocation invocationWithMethodSignature:
[self methodSignatureForSelector:sel]];
[inv setTarget:self];
[inv setSelector:sel];
// запустити викликати
[inv invoke];
Перевага класу |