Namespaces
Variants

std:: any

From cppreference.net
Utilities library
Определено в заголовке <any>
class any ;
(начиная с C++17)

Класс any описывает типобезопасный контейнер для одиночных значений любого копируемого типа.

1) Объект класса any хранит экземпляр любого типа, удовлетворяющего требованиям конструктора, или является пустым, и это называется состоянием объекта класса any . Хранимый экземпляр называется содержащимся объектом. Два состояния эквивалентны, если они либо оба пусты, либо оба не пусты и содержащиеся объекты эквивалентны.
2) Функции, не являющиеся членами класса, any_cast обеспечивают типобезопасный доступ к содержащемуся объекту.

Обычно реализации применяют оптимизацию малых объектов (избегая динамических выделений памяти) к типам, для которых std::is_nothrow_move_constructible имеет значение true .

Содержание

Функции-члены

создает объект any
(публичная функция-член)
присваивает объект any
(публичная функция-член)
уничтожает объект any
(публичная функция-член)
Модификаторы
изменяет содержащийся объект, конструируя новый объект напрямую
(публичная функция-член)
уничтожает содержащийся объект
(публичная функция-член)
обменивает два объекта any
(публичная функция-член)
Наблюдатели
проверяет, содержит ли объект значение
(публичная функция-член)
возвращает typeid содержащегося значения
(публичная функция-член)

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

специализирует алгоритм std::swap
(функция)
(C++17)
типобезопасный доступ к содержащемуся объекту
(шаблон функции)
(C++17)
создаёт объект any
(шаблон функции)

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

исключение, выбрасываемое формами 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
no value
3

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

(C++11)
копируемая обёртка любого копируемого вызываемого объекта
(шаблон класса)
перемещаемая обёртка любого вызываемого объекта, поддерживающего квалификаторы в заданной сигнатуре вызова
(шаблон класса)
(C++17)
типобезопасное размеченное объединение
(шаблон класса)
(C++17)
обёртка, которая может содержать или не содержать объект
(шаблон класса)
(C++11)
умный указатель с семантикой уникального владения объектом
(шаблон класса)
(C++26)
обёртка, содержащая динамически выделенный объект с семантикой значения
(шаблон класса)
полиморфная обёртка, содержащая динамически выделенный объект с семантикой значения
(шаблон класса)