std::bind în C++

Creează o funcție nouă dintr-una existentă, fixând unele argumente sau schimbându-le ordinea.

Sintaxă
#include <functional>
using namespace std::placeholders;   // _1, _2, ...
auto g = std::bind(f, argumente_sau_placeholdere...);

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 bind crezând că rămâne legată. Argumentele fixe sunt copiate; ca să păstrezi referința, folosește std::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.