Класс 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,
которая проверяет хранимый тип