std::get (std::variant)
Материал из cppreference.com
<tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num t-dcl-rev-notes t-since-cxx17 ">
</tbody><tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num t-dcl-rev-notes t-since-cxx17 ">
</tbody><tbody>
</tbody>
| Определено в заголовочном файле <variant>
|
||
| (1) | (начиная с C++17) | |
template< std::size_t I, class... Types > constexpr std::variant_alternative_t<I, std::variant<Types...>>& get( std::variant<Types...>& v ); |
||
template< std::size_t I, class... Types > constexpr std::variant_alternative_t<I, std::variant<Types...>>&& get( std::variant<Types...>&& v ); |
||
template< std::size_t I, class... Types > constexpr const std::variant_alternative_t<I, std::variant<Types...>>& get( const std::variant<Types...>& v ); |
||
template< std::size_t I, class... Types > constexpr const std::variant_alternative_t<I, std::variant<Types...>>&& get( const std::variant<Types...>&& v ); |
||
| (2) | (начиная с C++17) | |
template< class T, class... Types > constexpr T& get( std::variant<Types...>& v ); |
||
template< class T, class... Types > constexpr T&& get( std::variant<Types...>&& v ); |
||
template< class T, class... Types > constexpr const T& get( const std::variant<Types...>& v ); |
||
template< class T, class... Types > constexpr const T&& get( const std::variant<Types...>&& v ); |
||
1) Метод доступа к значению на основе индекса: если
v.index() == I, возвращает ссылку на значение, хранящееся в v. Иначе генерирует std::bad_variant_access. Вызов некорректен, если I не является допустимым индексом в variant.2) Метод доступа к значению на основе типа: если
v содержит альтернативу T, возвращает ссылку на значение, хранящееся в v. Иначе генерирует std::bad_variant_access. Вызов некорректен, если T не является уникальным элементом Types....Параметры шаблона
| I | — | индекс для поиска |
| T | — | уникальный тип для поиска |
| Types... | — | типы, образующие variant
|
Параметры
| v | — | variant
|
Возвращаемое значение
Ссылка на значение, хранящееся в варианте.
Исключения
1,2) Генерирует std::bad_variant_access при ошибках.
Пример
Запустить этот код
#include <variant>
#include <string>
#include <iostream>
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'; // ok, печатает 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 содержит int, а не float
Смотрите также
(C++17) |
получает указатель на значение variant, переданного по указателю, по индексу или типу (если он уникален), возвращает null при ошибке (шаблон функции) |
(C++11) |
доступ к определённому элементу кортежа (шаблон функции) |
(C++11) |
предоставляет доступ к элементу array (шаблон функции) |
(C++11) |
доступ к элементу пары (шаблон функции) |
(C++20) |
получает итератор или ограничитель из std::ranges::subrange (шаблон функции) |