C++ Functional

Da Andreabont's Wiki.

Dal C++11 è possibile utilizzare delle nuove funzionalità della libreria standard (header fucntional) per gestire le chiamate a funzione o a metodi.

Function

Questo template permette di "salvare" una funzione avente un certo numero di parametri e un tipo di ritorno predefiniti:

Salvare una funzione libera

void miaFunzione(int a) {
   // ...
}

std::function<void(int)> funzioneSalvata = miaFunzione;

funzioneSalvata(10); // Chiamata

Salvare una lambda

std::function<void(int)> funzioneSalvata = [](int a) { ... };

funzioneSalvata(10); // Chiamata

Bind

Bind è un template che genera un wrapper ad un'altra funzione o metodo avente parametri diversi, permettendo di "tradurre" i parametri da una chiamata all'altra.

#include <functional>

using namespace std;
using namespace std::placeholders;

class MyClass
{
    public:
        void test1(int a, int b) {}
        void test2(int a, int b) {}
};

void myFunction(int a, int b, int c) {}

int main()
{
    function<void (int,int)> callback;
    MyClass c1;
    callback=bind(&MyClass::test1,c1,_1,_2);
    callback(1,2);
    callback=bind(&MyClass::test2,c1,_2,_1);
    callback(1,2);
    callback=bind(&myFunction,_1,_2,0);
    callback(1,2);
}

Reference wrapper

Questo oggetto permette di avere un wrapper di una reference ad una variabile, che però può essere copiato.

#include <iostream>
#include <functional>

int main () {

  int a = 10;

  std::reference_wrapper<int> ref_a = a;

  ref_a++;

  std::cout << a << std::endl; // Stampa 11

}

E' possibile usare una funzione di aiuto per creare la reference:

auto ref_a = std::ref(a);