std::apply în C++

Apelează o funcție dând ca argumente, pe rând, elementele unui tuplu (sau ale unei perechi, ale unui std::array).

Sintaxă
template<class F, class Tuple>
constexpr decltype(auto) apply(F&& functie, Tuple&& t);

Ce face std::apply

std::apply(f, t) este echivalent cu f(std::get<0>(t), std::get<1>(t), ...), pentru toate elementele tuplului. Este util când ai argumentele deja grupate într-un tuplu, de exemplu salvate pentru un apel ulterior.

Împreună cu o lambda care primește auto&... elemente, std::apply este și modul obișnuit de a „parcurge” toate elementele unui tuplu.

Parametri

Parametru Descriere
functie Funcția sau lambda apelată; trebuie să accepte atâtea argumente câte elemente are tuplul.
t Tuplul, perechea sau std::array-ul cu argumentele.

Ce returnează

Ce returnează funcția apelată.

Exemple

Exemplul 1: Argumente dintr-un tuplu

#include <print>
#include <string>
#include <tuple>

double pret_final(double pret, int bucati, double reducere) {
    return pret * bucati * (1 - reducere);
}

int main() {
    std::tuple comanda{120.0, 3, 0.10};
    std::println("Total: {:.2f} lei", std::apply(pret_final, comanda));
}

Rezultat

Total: 324.00 lei

Exemplul 2: Afișarea tuturor elementelor unui tuplu

Lambda primește toate elementele deodată; expresia (... , ...) (fold expression) le parcurge pe rând.

#include <print>
#include <string>
#include <tuple>

int main() {
    std::tuple<std::string, int, char, double> date{"Iași", 2025, 'A', 9.75};
    std::apply([](const auto&... elemente) {
        ((std::print("[{}] ", elemente)), ...);
    }, date);
    std::println();
}

Rezultat

[Iași] [2025] [A] [9.75]

Greșeli frecvente

  • Numărul elementelor din tuplu nu se potrivește cu parametrii funcției: eroare de compilare lungă. Verifică întâi tipurile tuplului.
  • Dai lui std::apply o funcție supraîncărcată (cu mai multe variante) după nume. Compilatorul nu știe pe care să o aleagă; învelește apelul într-o lambda.

Comenzi înrudite

  • std::tuple: Grupează oricâte valori de tipuri diferite într-un singur obiect; generalizarea lui std::pair.
  • std::get: Citește elementul unui tuplu, al unei perechi sau al unui std::array după poziție (sau după tip), la compilare.
  • std::tuple_size: Dă, la compilare, numărul de elemente dintr-un tip tuple, pair sau std::array.