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