Тип функции

Последнее обновление: 24.03.2023

При определении указателя на функцию применяется синтаксис, который может показаться малочитабельным, например:

#include <iostream>
 
int sum(int, int);

int main()
{
    int (*operation)(int, int) {sum};	// указатель operation указывает на функцию sum
    std::cout << operation(3, 5) << std::endl;
}
int sum(int x, int y){  return x + y;}

Здесь operation представляет указатель на функцию, которая принимает два параметра типа int и возвращает значение int

int (*operation)(int, int)

Но даже такое определение может быть сложно воспринимать. Ситуация усугубляется, если параметры или возвращаемый результат представляют типы с более длинными названиями. Использовагие ключевого слова auto позволяет упростить определение:

auto operation {sum};

Однако в данном случае нам надо обязательно инициализировать указатель определенной функцией. Кроме того, иногда возникает необходимость явным образом указать тип указателя, например, для параметра функции или переменной. Так как указатель на функцию представляет отдельный тип, то для него можно определить псевдноним с помощью ключевого слова using:

#include <iostream>
 
// BinaryOp представляет указатель на функцию типа int (*)(int, int)
using BinaryOp = int (*)(int, int);

int sum(int, int);
int subtract(int, int);

int main()
{
    BinaryOp operation {sum};
    std::cout << operation(8, 5) << std::endl;	// 13
	operation = subtract;
    std::cout << operation(8, 5) << std::endl;	// 3
}
int sum(int x, int y){  return x + y;}
int subtract(int x, int y){  return x - y;}

В данном случае определен псевдоним BinaryOp, который представляет указатель на функцию типа int (*)(int, int), то есть функцию, которая принимает два числа int и возвращает значение типа int.

using BinaryOp = int (*)(int, int);

Далее мы можем, используя этот псевдоним, мы можем определять указатели на функции, которые соответствуют типу указателя:

BinaryOp operation {sum};

Аналогичным образом можно использовать псевдонимы для определения параметров:

#include <iostream>
 
// BinaryOp представляет указатель на функцию типа int (*)(int, int)
using BinaryOp = int (*)(int, int);

int sum(int, int);
int subtract(int, int);
void do_operation(int, int, BinaryOp);

int main()
{
    do_operation(10, 6, sum);		// 16
    do_operation(10, 6, subtract);	// 4
}
void do_operation(int a, int b, BinaryOp op)
{
	double result = op(a, b);
	std::cout << result << std::endl;
}
int sum(int x, int y){  return x + y;}
int subtract(int x, int y){  return x - y;}

В данном случае третий параметр функции do_operation представляет указатель типа int (*)(int, int).

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850