Функция get_if
Функция get_if возвращает указатель на значение,
хранящееся в объекте variant, если тип этого
значения совпадает с запрошенным. В отличие от функции
get, которая при несовпадении типа выбрасывает
исключение, get_if в такой ситуации возвращает
nullptr. В первый параметр мы передаем указатель
на объект variant, а во второй - тип, значение
которого мы хотим получить. Также существует перегрузка,
где во второй параметр передается индекс альтернативы.
Синтаксис
template <class T, class... Types>
T* get_if(variant<Types...>* pv) noexcept;
template <size_t I, class... Types>
auto get_if(variant<Types...>* pv) noexcept;
Пример
Давайте создадим variant, который хранит
значение типа int, и попробуем получить
его через get_if:
#include <iostream>
#include <variant>
using namespace std;
int main()
{
variant<int, double, string> var = 42;
int* p = get_if<int>(&var);
if (p != nullptr) {
cout << *p << endl;
}
return 0;
}
Результат выполнения кода:
42
Пример
Теперь попробуем запросить тип, которого нет в
variant. В этом случае get_if вернет
nullptr:
#include <iostream>
#include <variant>
using namespace std;
int main()
{
variant<int, double, string> var = 42;
double* p = get_if<double>(&var);
if (p == nullptr) {
cout << "nullptr" << endl;
}
return 0;
}
Результат выполнения кода:
"nullptr"
Пример
Также можно обращаться к значению по индексу
альтернативы. Давайте получим элемент с индексом
2 (это строка string):
#include <iostream>
#include <variant>
#include <string>
using namespace std;
int main()
{
variant<int, double, string> var = "abcde";
string* p = get_if<2>(&var);
if (p != nullptr) {
cout << *p << endl;
}
return 0;
}
Результат выполнения кода:
"abcde"
Смотрите также
-
класс
variant,
который хранит значение одного из нескольких типов -
функция
get,
которая получает значение из variant с проверкой -
функция
holds_alternative,
которая проверяет, хранится ли в variant заданный тип -
метод
index,
который возвращает индекс текущей альтернативы