std::get în C++

Citește elementul unui tuplu, al unei perechi sau al unui std::array după poziție (sau după tip), la compilare.

Sintaxă
template<std::size_t I, class... Types>
auto& get(std::tuple<Types...>& t);

template<class T, class... Types>
T& get(std::tuple<Types...>& t);   // după tip, C++14

Ce face std::get

std::get<I>(t) returnează o referință la elementul de pe poziția I (de la 0). Funcționează pentru std::tuple, std::pair (0 = first, 1 = second), std::array și std::variant. Poziția trebuie să fie o constantă; dacă este prea mare, programul nu compilează, deci nu există erori la rulare.

Din C++14 poți alege elementul după tip: std::get<std::string>(t). Merge doar dacă tipul apare o singură dată în tuplu; altfel, eroare de compilare.

Parametri

Parametru Descriere
I Poziția elementului (constantă la compilare).
T Sau: tipul elementului, dacă este unic în tuplu.
t Tuplul, perechea sau tabloul.

Ce returnează

O referință la element, deci îl poți și modifica.

Exemple

Exemplul 1: După poziție și după tip

#include <array>
#include <print>
#include <string>
#include <tuple>
#include <utility>

int main() {
    std::tuple<std::string, int, double> carte{"Ion", 1920, 39.9};
    std::get<2>(carte) = 34.5;                       // modificare
    std::println("{} ({}) - {} lei", std::get<0>(carte), std::get<int>(carte), std::get<double>(carte));

    std::pair<std::string, int> p{"Cluj", 1};
    std::println("{} {}", std::get<0>(p), std::get<1>(p));

    std::array<int, 3> a{7, 8, 9};
    std::println("{}", std::get<2>(a));
}

Rezultat

Ion (1920) - 34.5 lei
Cluj 1
9

Greșeli frecvente

  • Scrii std::get<3>(t) pe un tuplu cu 3 elemente: eroare de compilare (pozițiile sunt 0, 1, 2).
  • Folosești std::get<int>(t) pe un tuplu cu două int-uri: compilatorul nu știe pe care să-l aleagă și dă eroare. Folosește poziția.
  • Folosești std::get pe un std::variant care conține alt tip: aruncă std::bad_variant_access. Verifică întâi cu std::holds_alternative sau folosește std::get_if.

Comenzi înrudite

  • std::tuple: Grupează oricâte valori de tipuri diferite într-un singur obiect; generalizarea lui std::pair.
  • std::pair: Grupează două valori, eventual de tipuri diferite, într-un singur obiect cu membrii first și second.
  • std::array: Tablou cu dimensiune fixă, cunoscută la compilare, cu interfața unui container (size, at, begin, end).
  • std::tie: Creează un tuplu de referințe la variabile existente: despachetează un tuplu în ele sau compară mai multe câmpuri deodată.
  • std::variant: O valoare care are, la un moment dat, exact unul dintre mai multe tipuri posibile (union sigur).