std::any
Материал из cppreference.com
Определено в заголовочном файле <any> | ||
class any; | (начиная с 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 функция-элемент) |
[править]Функции, не являющиеся элементами
(C++17) | специализация алгоритма std::swap (функция) |
(C++17) | типобезопасный доступ к содержащемуся объекту (шаблон функции) |
(C++17) | создаёт объект any (шаблон функции) |
[править]Вспомогательные классы
(C++17) | исключение, создаваемое формами с возвращаемым значением 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(conststd::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
[править]Смотрите также
(C++11) | обёртывает вызываемый объект любого конструируемого копированием типа с указанной сигнатурой вызова функции (шаблон класса) |
(C++23) | обёртывает вызываемый объект любого типа с указанной сигнатурой вызова функции (шаблон класса) |
(C++17) | типобезопасное размеченное объединение (шаблон класса) |
(C++17) | обёртка, которая может содержать или не содержать объект (шаблон класса) |