РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
448 of 815 menu

Функция std::get

Функция std::get извлекает значение из объекта std::variant. В первый параметр мы передаем сам объект variant, а во второй - либо индекс альтернативы (начиная с 0), либо тип, который хранится в variant. Если запрашиваемый индекс или тип не совпадает с текущим активным значением, генерируется исключение std::bad_variant_access. Также существует перегрузка, принимающая указатель на variant и возвращающая указатель на значение или nullptr, если тип не совпадает.

Синтаксис

std::get<index>(v) std::get<type>(v) std::get<type>(&v) std::get<index>(&v)

Пример

Давайте создадим std::variant, который может хранить int, double или std::string, и извлечем из него значение по индексу 0:

#include <iostream> #include <variant> #include <string> using namespace std; int main() { variant<int, double, string> v = 12345; cout << get<0>(v) << endl; return 0; }

Результат выполнения кода:

12345

Пример

Теперь извлечем значение из variant по типу. Пусть variant хранит строку "abcde":

#include <iostream> #include <variant> #include <string> using namespace std; int main() { variant<int, double, string> v = "abcde"; cout << get<string>(v) << endl; return 0; }

Результат выполнения кода:

"abcde"

Пример

Если запросить не тот тип, который хранится в variant, будет выброшено исключение std::bad_variant_access. Давайте попробуем извлечь int из variant, который сейчас хранит double:

#include <iostream> #include <variant> using namespace std; int main() { variant<int, double> v = 3.14; try { cout << get<int>(v) << endl; } catch (const bad_variant_access& e) { cout << "bad_variant_access" << endl; } return 0; }

Результат выполнения кода:

"bad_variant_access"

Пример

Также можно использовать указательную перегрузку std::get, которая не выбрасывает исключение, а возвращает nullptr, если тип не совпадает:

#include <iostream> #include <variant> #include <string> using namespace std; int main() { variant<int, string> v = "abcde"; if (auto p = get_if<string>(&v)) { cout << *p << endl; } else { cout << "not a string" << endl; } return 0; }

Результат выполнения кода:

"abcde"

Смотрите также

  • класс variant,
    который хранит одно из нескольких значений
  • метод index,
    который возвращает индекс активной альтернативы
  • функция get_if,
    которая безопасно извлекает значение без исключений
  • функция holds_alternative,
    которая проверяет, хранится ли в variant заданный тип
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить