Функция 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 заданный тип