Класс bad_variant_access
Класс bad_variant_access - это исключение, которое выбрасывается
функциями std::get и std::get_if при попытке
получить доступ к альтернативе, которая в данный момент не
хранится в объекте std::variant. Это исключение
наследуется от класса std::exception и не имеет
дополнительных методов, кроме унаследованного метода what.
Оно позволяет безопасно обрабатывать ошибки доступа к вариантам
с помощью стандартных механизмов обработки исключений.
Синтаксис
class bad_variant_access : public exception;
Пример
Давайте создадим объект std::variant, который хранит
целое число, и попробуем получить из него строку. Это
приведёт к выбросу исключения bad_variant_access:
#include <iostream>
#include <variant>
#include <string>
using namespace std;
int main()
{
variant<int, string> v = 123;
try
{
cout << get<string>(v) << endl;
}
catch (const bad_variant_access& e)
{
cout << "Error: " << e.what() << endl;
}
return 0;
}
Результат выполнения кода:
"Error: bad variant access"
Пример
Давайте используем функцию std::get_if, которая возвращает
указатель на значение, если тип совпадает, или nullptr в
противном случае. При несовпадении типа исключение не
выбрасывается, что позволяет избежать ошибки:
#include <iostream>
#include <variant>
#include <string>
using namespace std;
int main()
{
variant<int, string> v = "abcde";
if (auto p = get_if<int>(&v))
{
cout << "Int: " << *p << endl;
}
else
{
cout << "Not an int" << endl;
}
return 0;
}
Результат выполнения кода:
"Not an int"