#include <iostream>
#include <functional>
#include <vector>
double multiply(double a, double b) {
return a * b;
}
double sum(double a, double b) {
return a + b;
}
int main() {
// Wskaźnik na funkcję "w stylu C" o nazwie funcPtr
// double (*funcPtr)(double a, double b);
//
// "Surowa tablica" wskaźników na takie funkcje
double (*funcTable1[])(double, double) = { multiply, sum };
// I wywołanie takiej funkcji
std::cout << funcTable1[0](10, 20) << '\n';
// Oczywiście nieco łatwiej będzie zdefiniować typ
// takiego wskaźnika
typedef double(*funcPtrType)(double, double);
// .. i go użyć np. w tablicy
funcPtrType funcTable2[] = { sum, multiply };
// i wywołanie
std::cout << funcTable2[0](12, 12) << '\n';
// Dzięki takiej konstrukcji można łatwo definiować np. prostą maszynę stanów
// lub wykonywać obliczenia leniwie czyli dopiero w momencie gdy obliczenia
// są absolutnie niezbędne.
// ALE...
// Po co się tak męczyć jeśli od C++11 dostępny typ dla obiektów wywoływanych...
std::vector<std::function<double(double, double)>> vecFunct{ multiply, sum,
[](double a, double b) { // Lambda także...
return a * 2 + b;
}
};
std::cout << vecFunct[2](12, 33) << '\n';
}