Ce face std::bind
std::bind(f, 10, _1) returnează un obiect apelabil care, apelat cu x, apelează f(10, x). Valorile scrise direct sunt fixate (copiate), iar _1, _2… (din std::placeholders) arată unde merg argumentele primite la apel.
În codul modern, o lambda face același lucru mai clar: [](int x) { return f(10, x); }. Pentru fixarea primelor argumente există și std::bind_front (C++20). std::bind rămâne util în cod mai vechi.
Parametri
| Parametru | Descriere |
|---|---|
f |
Funcția de bază. |
argumente_sau_placeholdere |
Valori fixe sau _1, _2… pentru argumentele date la apel. |
Ce returnează
Un obiect apelabil nou.
Exemple
Exemplul 1: Fixarea unui argument și schimbarea ordinii
#include <functional>
#include <print>
double pretCuTva(double pret, double cota) { return pret * (1 + cota); }
int scade(int a, int b) { return a - b; }
int main() {
using namespace std::placeholders;
auto tva21 = std::bind(pretCuTva, _1, 0.21);
std::println("100 lei cu TVA: {:.2f} lei", tva21(100));
auto inversat = std::bind(scade, _2, _1);
std::println("inversat(3, 10) = {}", inversat(3, 10)); // scade(10, 3)
}
Rezultat
100 lei cu TVA: 121.00 lei
inversat(3, 10) = 7
Exemplul 2: Același lucru cu o lambda
#include <print>
double pretCuTva(double pret, double cota) { return pret * (1 + cota); }
int main() {
auto tva9 = [](double pret) { return pretCuTva(pret, 0.09); };
std::println("50 lei cu TVA 9%: {:.2f} lei", tva9(50));
}
Rezultat
50 lei cu TVA 9%: 54.50 lei
Greșeli frecvente
- Fixezi o variabilă cu
bindcrezând că rămâne legată. Argumentele fixe sunt copiate; ca să păstrezi referința, foloseștestd::ref(variabila).
Comenzi înrudite
std::bind_front: Fixează primele argumente ale unei funcții și returnează o funcție care le primește doar pe restul.std::function: Variabilă care poate ține orice funcție, lambda sau obiect apelabil cu o anumită semnătură.std::ref: Împachetează o referință ca să poată fi transmisă prin funcții care copiază argumentele (thread, bind).lambda ([](){}): O funcție fără nume, scrisă direct acolo unde e folosită; poate „captura” variabile din jur.