MySQL Java JavaScript PHP Python HTML-CSS C-sharp C++ Go

Tipul funcției

La definirea unui pointer către o funcție se utilizează o sintaxă care poate părea greu de citit, de exemplu:

#include <iostream>
  
int sum(int, int);
 
int main()
{
    int (*operation)(int, int) {sum};   // pointerul operation indică funcția sum
    std::cout << operation(3, 5) << std::endl;
}
int sum(int x, int y){  return x + y; }

Aici operation reprezintă un pointer la o funcție care primește doi parametri de tip int și returnează un int:

int (*operation)(int, int)

Dar chiar și o astfel de definiție poate fi greu de înțeles. Situația se complică și mai mult dacă parametrii sau valoarea returnată au tipuri cu denumiri mai lungi. Utilizarea cuvântului cheie auto permite simplificarea definiției:

auto operation {sum};

Totuși, în acest caz este necesară inițializarea pointerului cu o funcție concretă. În plus, uneori este nevoie să specificăm în mod explicit tipul pointerului, de exemplu pentru un parametru al unei funcții sau o variabilă. Deoarece un pointer la funcție reprezintă un tip distinct, putem defini un pseudonim pentru acesta folosind cuvântul cheie using:

#include <iostream>
  
// BinaryOp reprezintă un pointer la funcție de tipul 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; }

În acest caz este definit pseudonimul BinaryOp, care reprezintă un pointer la funcție de tip int (*)(int, int), adică o funcție care primește două valori int și returnează un int:

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

Apoi, folosind acest pseudonim, putem defini pointeri către funcții care corespund acestui tip:

BinaryOp operation {sum};

În mod similar, putem utiliza pseudonimele pentru a defini tipuri de parametri:

#include <iostream>
  
// BinaryOp reprezintă un pointer la funcție de tipul 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; }

În acest caz, al treilea parametru al funcției do_operation reprezintă un pointer de tip int (*)(int, int).