std::get(std::variant)
С ru.cppreference.net
| Определён в заголовке <variant>
|
||
template< std::size_t I, class... Types >
constexpr std::variant_alternative_t<I, std::variant<Types...>>&
get( std::variant<Types...>& v );
|
(1) | (начиная с C++17) |
template< std::size_t I, class... Types >
constexpr std::variant_alternative_t<I, std::variant<Types...>>&&
get( std::variant<Types...>&& v );
|
(2) | (начиная с C++17) |
template< std::size_t I, class... Types >
constexpr const std::variant_alternative_t<I, std::variant<Types...>>&
get( const std::variant<Types...>& v );
|
(3) | (начиная с C++17) |
template< std::size_t I, class... Types >
constexpr const std::variant_alternative_t<I, std::variant<Types...>>&&
get( const std::variant<Types...>&& v );
|
(4) | (начиная с C++17) |
template< class T, class... Types >
constexpr T& get( std::variant<Types...>& v );
|
(5) | (начиная с C++17) |
template< class T, class... Types >
constexpr T&& get( std::variant<Types...>&& v );
|
(6) | (начиная с C++17) |
template< class T, class... Types >
constexpr const T& get( const std::variant<Types...>& v );
|
(7) | (начиная с C++17) |
template< class T, class... Types >
constexpr const T&& get( const std::variant<Types...>&& v );
|
(8) | (начиная с C++17) |
1-4) Доступ по значению на основе индекса: Если
v.index() == I, возвращает ссылку на значение, хранящееся в v. В противном случае генерирует std::bad_variant_access. Вызов является некорректным, если I не является допустимым индексом в variant.5-8) Доступ по значению на основе типа: Если
v содержит альтернативу T, возвращает ссылку на значение, хранящееся в v. В противном случае генерирует std::bad_variant_access. Вызов является некорректным, если T не является уникальным элементом Types....Параметры шаблона
| I | - | индекс для поиска |
| T | - | уникальный тип для поиска |
| Types... | - |
типы, формирующие
variant
|
Параметры
| v | - |
a
variant
|
Возвращаемое значение
Ссылка на значение, хранящееся в варианте.
Исключения
1,2)
Выбрасывает
std::bad_variant_access
при ошибках.
Пример
Запустить этот код
#include <iostream> #include <string> #include <variant> int main() { std::variant<int, float> v{12}, w; std::cout << std::get<int>(v) << '\n'; w = std::get<int>(v); w = std::get<0>(v); // тот же эффект, что и в предыдущей строке // std::get<double>(v); // ошибка: нет double в [int, float] // std::get<3>(v); // ошибка: допустимые значения индекса 0 и 1 try { w = 42.0f; std::cout << std::get<float>(w) << '\n'; // ок, выводит 42 w = 42; std::cout << std::get<float>(w) << '\n'; // выбрасывает исключение } catch (std::bad_variant_access const& ex) { std::cout << ex.what() << ": w содержит int, а не float\n"; } }
Возможный вывод:
12 42 Unexpected index: w contained int, not float
Смотрите также
|
(C++17)
|
получает указатель на значение указанного
variant
по индексу или типу (если уникален), возвращает null при ошибке
(шаблон функции) |
|
(C++11)
|
доступ к указанному элементу tuple
(шаблон функции) |
|
(C++11)
|
доступ к элементу
array
(шаблон функции) |
|
(C++11)
|
доступ к элементу
pair
(шаблон функции) |
|
(C++20)
|
получает итератор или sentinel из
std::ranges::subrange
(шаблон функции) |
|
(C++26)
|
получает ссылку на действительную или мнимую часть из
std::complex
(шаблон функции) |