Ce face std::holds_alternative
std::holds_alternative<T>(v) returnează true dacă v conține acum o valoare de tip T.
std::get_if<T>(&v) face verificarea și citirea într-un singur pas: returnează un pointer la valoare dacă tipul se potrivește, altfel nullptr. Atenție, primește adresa variant-ului. Nu aruncă excepții.
Parametri
| Parametru | Descriere |
|---|---|
T |
Tipul căutat. |
v / pv |
Variant-ul (pentru get_if, un pointer la el). |
Ce returnează
holds_alternative: bool. get_if: T* sau nullptr.
Exemple
Exemplul 1: Răspunsul unui server: date sau cod de eroare
#include <print>
#include <string>
#include <variant>
using Raspuns = std::variant<std::string, int>; // text sau cod de eroare
void trateaza(const Raspuns& r) {
if (std::holds_alternative<int>(r)) {
std::println("Eroare {}", std::get<int>(r));
} else {
std::println("Date: {}", std::get<std::string>(r));
}
}
int main() {
trateaza(std::string("{\"oras\": \"Iași\"}"));
trateaza(404);
}
Rezultat
Date: {"oras": "Iași"}
Eroare 404
Exemplul 2: get_if în loc de excepții
#include <print>
#include <variant>
int main() {
std::variant<int, double> v = 7.5;
if (auto* d = std::get_if<double>(&v)) {
std::println("double: {}", *d);
}
if (auto* i = std::get_if<int>(&v)) {
std::println("int: {}", *i);
} else {
std::println("nu conține int");
}
}
Rezultat
double: 7.5
nu conține int
Greșeli frecvente
- Scrii
std::get_if<int>(v), fără&. Nu compilează:get_ifprimește un pointer la variant.
Comenzi înrudite
std::variant: O valoare care are, la un moment dat, exact unul dintre mai multe tipuri posibile (union sigur).std::visit: Apelează o funcție cu valoarea curentă dintr-un std::variant, oricare ar fi tipul ei.std::get: Citește elementul unui tuplu, al unei perechi sau al unui std::array după poziție (sau după tip), la compilare.