Указатели на функции как параметры
Указатель на функцию может передаваться в другую функцию в качестве параметра. Например:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
int add(int, int);
int subtract(int, int);
int operation(int(*)(int, int), int, int);
int main()
{
int a = 10;
int b = 5;
int result;
result = operation(add, a, b);
std::cout << "result: " << result << std::endl;
result = operation(subtract, a, b);
std::cout << "result: " << result << std::endl;
return 0;
}
int add(int x, int y)
{
return x + y;
}
int subtract(int x, int y)
{
return x - y;
}
int operation(int(*op)(int, int), int a, int b)
{
return op(a, b);
}
В данном случае первый параметр функции operation - int (*op)(int, int) - представляет указатель на функцию, которая возвращает значение типа int и принимает два параметра типа int. Результатом функции является вызов той функции, на которую указывает указатель.
Определению указателя соответствуют две функции: add и subtract, поэтому их адрес можно передать в вызов функции operation: operation(add, a, b);.
Результат работы программы:
result: 15
result: 5
Другой пример - функция, которая может принимать в качестве параметра некоторое условие:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
int isEven(int);
int isPositive(int);
void action(int(*)(int), int[], int);
int main()
{
int nums[] = { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5 };
int n = sizeof(nums) / sizeof(nums[0]);
std::cout << "Even numbers: " << std::endl;
action(isEven, nums, n);
std::cout << "Positive numbers: " << std::endl;
action(isPositive, nums, n);
return 0;
}
int isEven(int x)
{
return x % 2 == 0;
}
int isPositive(int x)
{
return x>0;
}
void action(int(*condition)(int), int numbers[], int n)
{
for (int i = 0; i<n; i++)
{
if (condition(numbers[i]) != 0)
{
std::cout << numbers[i] << "\t";
}
}
std::cout << std::endl;
}
Первый параметр функции action - указатель int (*condition)(int) представляет функцию, которая принимает целое число и в зависимости от того, соответствует оно условию или нет, возвращает 1 (если соответствует) или 0. На момент определения функции action точное условие может быть неизвестно.
В текущей программе условия представлены двумя функциями. Функция isEven() возвращает 1, если число четное, и 0, если число нечетное. А функция isPositive() возвращает 1, если число положительное, и 0, если отрицательное.
При вызове функции action() в нее можно передать нужное условие: action(isEven, nums, n);. В итоге программа выведет на экран числа из массива nums, которые соответствуют переданному условию:
Even numbers: -4 -2 0 2 4
Positive numbers: 1 2 3 4 5