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 luic, iar originalul nu se schimbă. Dă adresa (&c) saustd::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.