◐ Shell
clean mode source ↗

std::any — cppreference.com

Материал из 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 функция-элемент) [править]

Функции, не являющиеся элементами

Вспомогательные классы

исключение, создаваемое формами с возвращаемым значением 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

Смотрите также

обёртывает вызываемый объект любого конструируемого копированием типа с указанной сигнатурой вызова функции
(шаблон класса) [править]
обёртывает вызываемый объект любого типа с указанной сигнатурой вызова функции
(шаблон класса) [править]
типобезопасное размеченное объединение
(шаблон класса) [править]
обёртка, которая может содержать или не содержать объект
(шаблон класса) [править]