In computer programming, a function object is a construct allowing an object to be invoked or called as if it were an ordinary function, usually with the same syntax (a function parameter that can also be a function). Function objects are often called functors.
C
C program using function pointers may appear as:
#include <stdlib.h>
/* qsort() callback function, returns < 0 if a < b, > 0 if a > b, 0 if a == b */
int compareInts(const void* a, const void* b)
{
return (*(int *)a > *(int *)b) - (*(int *)a < *(int *)b);
}
...
// prototype of qsort is
// void qsort(void *base, size_t nel, size_t width, int (*compar)(const void *, const void *));
...
int main(void)
{
int items[] = { 4, 3, 1, 2 };
qsort(items, sizeof(items) / sizeof(items[0]), sizeof(items[0]), compareInts);
return 0;
}
C++
In C++, a function object may be used instead of an ordinary function by defining a class that overloads the function call operator by defining an operator()
member function. In C++, this may appear as follows:
定义一个class,该类重载函数调用operator, 能访问对象中的成员
// comparator predicate: returns true if a < b, false otherwise struct IntComparator //class { bool operator()(const int &a, const int &b) const// operator() member function { return a < b; } }; int main() { std::vector<int> items { 4, 3, 1, 2 }; std::sort(items.begin(), items.end(), IntComparator());//使用方式 return 0; }
Notice that the syntax for providing the callback to the std::sort()
function is identical, but an object is passed instead of a function pointer. When invoked, the callback function is executed just as any other member function, and therefore has full access to the other members (data or functions) of the object.
lambda expression
int main() { std::vector<Employee> emps; /* code to populate database */ const std::string sort_field = "idnum"; std::sort(emps.begin(), emps.end(), [&sort_field](const Employee& a, const Employee& b){ /* code to select and compare field */ }); return 0; }