std::bind_front în C++

Fixează primele argumente ale unei funcții și returnează o funcție care le primește doar pe restul.

Sintaxă
#include <functional>
template<class F, class... Args>
constexpr auto bind_front(F&& f, Args&&... primele_argumente);

Ce face std::bind_front

std::bind_front(f, a, b) returnează un obiect care, apelat cu (x, y), apelează f(a, b, x, y). Este varianta simplă și modernă a lui std::bind: nu are nevoie de _1, _2.

Merge foarte bine cu metodele: std::bind_front(&Clasa::metoda, &obiect) dă o funcție care apelează metoda pe acel obiect. Argumentele fixate sunt copiate (sau mutate); pentru referințe, folosește std::ref.

Parametri

Parametru Descriere
f Funcția de bază.
primele_argumente Valorile fixate la începutul listei de argumente.

Ce returnează

Un obiect apelabil nou.

Exemple

Exemplul 1: Un mesaj cu prefix fix

#include <functional>
#include <print>
#include <string>

void jurnal(const std::string& nivel, const std::string& mesaj) {
    std::println("[{}] {}", nivel, mesaj);
}

int main() {
    auto eroare = std::bind_front(jurnal, "EROARE");
    auto info = std::bind_front(jurnal, "INFO");

    info("Server pornit");
    eroare("Baza de date nu răspunde");
}

Rezultat

[INFO] Server pornit
[EROARE] Baza de date nu răspunde

Exemplul 2: O metodă legată de un obiect

#include <functional>
#include <print>

struct Cont {
    double sold = 0;
    void depune(double suma) { sold += suma; }
};

int main() {
    Cont c;
    auto depuneInCont = std::bind_front(&Cont::depune, &c);
    depuneInCont(150);
    depuneInCont(50);
    std::println("sold: {} lei", c.sold);
}

Rezultat

sold: 200 lei

Greșeli frecvente

  • Legi o metodă de obiect prin valoare (std::bind_front(&Cont::depune, c)). Se lucrează pe o copie a lui c, iar originalul nu se schimbă. Dă adresa (&c) sau std::ref(c).

Comenzi înrudite

  • std::bind: Creează o funcție nouă dintr-una existentă, fixând unele argumente sau schimbându-le ordinea.
  • std::function: Variabilă care poate ține orice funcție, lambda sau obiect apelabil cu o anumită semnătură.
  • std::mem_fn: Transformă un pointer la metodă sau la câmp într-o funcție obișnuită care primește obiectul ca argument.
  • lambda ([](){}): O funcție fără nume, scrisă direct acolo unde e folosită; poate „captura” variabile din jur.