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::applyo 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.