std::any — cppreference.com
Материал из cppreference.com
<tbody> </tbody>
| Определено в заголовочном файле |
||
|
|
(начиная с C++17) | |
Класс any описывает типобезопасный контейнер для отдельных значений любого копируемого типа.
1) Объект класса any хранит экземпляр любого типа, который соответствует требованиям конструктора или является пустым, и это называется состоянием объекта класса any. Сохранённый экземпляр называется вложенным объектом. Два состояния эквивалентны, если они оба пусты или оба не пусты и если содержащиеся объекты эквивалентны.
2) Функции any_cast не являющиеся элементами, обеспечивают безопасный по типу доступ к содержащемуся объекту.
Реализациям рекомендуется избегать динамического выделения памяти для небольших объектов, но такая оптимизация может применяться только к типам, для которых std::is_nothrow_move_constructible возвращает true.
Функции-элементы
создаёт объект any (public функция-элемент) [править] | |
присваивает объект any (public функция-элемент) [править] | |
уничтожает объект any (public функция-элемент) [править] | |
Модификаторы | |
| изменяет содержащийся объект, созданием нового объекта напрямую (public функция-элемент) [править] | |
| уничтожает содержащийся объект (public функция-элемент) [править] | |
обменивает два объекта any (public функция-элемент) [править] | |
Наблюдатели | |
| проверяет, содержит ли объект значение (public функция-элемент) [править] | |
возвращает typeid содержащегося значения (public функция-элемент) [править] | |
Функции, не являющиеся элементами
Вспомогательные классы
исключение, создаваемое формами с возвращаемым значением any_cast при несоответствии типа (класс) [править] |
Примечание
| Макрос Тестирования функциональности | Значение | Стандарт | Функциональность |
|---|---|---|---|
__cpp_lib_any |
201606L |
(C++17) | std::any
|
Пример
#include <any> #include <iostream> int main() { std::cout << std::boolalpha; // любой тип std::any a = 1; std::cout << a.type().name() << ": " << std::any_cast<int>(a) << '\n'; a = 3.14; std::cout << a.type().name() << ": " << std::any_cast<double>(a) << '\n'; a = true; std::cout << a.type().name() << ": " << std::any_cast<bool>(a) << '\n'; // неверное приведение try { a = 1; std::cout << std::any_cast<float>(a) << '\n'; } catch (const std::bad_any_cast& e) { std::cout << e.what() << '\n'; } // имеет значение a = 2; if (a.has_value()) { std::cout << a.type().name() << << ": " << std::any_cast<int>(a) << '\n'; } // сброс a.reset(); if (!a.has_value()) { std::cout << "нет значения\n"; } // указатель на содержащиеся данные a = 3; int* i = std::any_cast<int>(&a); std::cout << *i << '\n'; }
Возможный вывод:
int: 1 double: 3.14 bool: true bad any_cast int: 2 нет значения 3
Смотрите также
| обёртывает вызываемый объект любого конструируемого копированием типа с указанной сигнатурой вызова функции (шаблон класса) [править] | |
| обёртывает вызываемый объект любого типа с указанной сигнатурой вызова функции (шаблон класса) [править] | |
| типобезопасное размеченное объединение (шаблон класса) [править] | |
| обёртка, которая может содержать или не содержать объект (шаблон класса) [править] |