#include <functional>
#include <iostream>

double function_a(double a, double b, double c, double d)
{
    std::cout << "function_a(" << a << ", " << b << ", " << c << ", " << d << ")\n";
    return a;
}

double function_b(double a, double b, int t, int u, double c)
{
    std::cout << "function_b(" << a << ", " << b << ", " << t << ", " << u << ", " << c << ")\n";
    return a;
}

struct second_func
{
    second_func(int t, int u, double c) :t(t), u(u), c(c) {}

    double operator()(double a, double b) { return function_b(a, b, t, u, c); }

    int t;
    int u;
    double c;
};


void PerformAnalysis(std::function<double(double, double)> func)
{
    func(4.0, 5.0);
}

int main()
{
    auto first_func = [](double a, double b) { return function_a(a, b, 60.0, 2.1); };

    // or:
    // double c = 60.0;
    // double d = 1.2;
    // auto first_func = [=](double a, double b) { return function_a(a, b, c, d); };

    PerformAnalysis(first_func);
    PerformAnalysis(second_func(5, 90, 2.6));
}