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

Класс variant

Класс variant представляет собой типобезопасное объединение (union), способное хранить значение одного из нескольких заранее определённых типов. В отличие от обычного union, variant знает, какой именно тип хранится в данный момент, и корректно управляет временем жизни объекта. Первым шаблонным параметром указывается первый альтернативный тип, затем второй, третий и так далее - всего можно перечислить любое количество типов.

Для доступа к хранимому значению используются функции get и get_if, для проверки текущего типа - holds_alternative, а для получения индекса активной альтернативы - метод index.

Синтаксис

#include <variant> std::variant<Type1, Type2, ...> v;

Пример

Давайте создадим variant, который может хранить либо целое число, либо строку, и выведем хранимое значение:

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

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

12345 "abcde"

Пример

Давайте проверим, какой тип хранится в variant в данный момент, с помощью функции holds_alternative:

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

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

"string"

Пример

Давайте используем get_if для безопасного получения указателя на хранимое значение:

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

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

12345 "not a string"

Пример

Давайте получим индекс активной альтернативы с помощью метода index:

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

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

1 0

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

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