std::holds_alternative în C++

holds_alternative verifică ce tip are acum un variant; get_if returnează pointer la valoare sau nullptr.

Sintaxă
template<class T, class... Types>
constexpr bool holds_alternative(const std::variant<Types...>& v) noexcept;
template<class T, class... Types>
constexpr T* get_if(std::variant<Types...>* pv) noexcept;

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_if primeș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.