Пространства имён
Варианты
Действия

std::any_cast

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
 
<tbody> </tbody>
Определено в заголовочном файле <any>
template< class T > T any_cast( const any& operand );
(1) (начиная с C++17)
template< class T > T any_cast( any& operand );
(2) (начиная с C++17)
template< class T > T any_cast( any&& operand );
(3) (начиная с C++17)
template< class T > const T* any_cast( const any* operand ) noexcept;
(4) (начиная с C++17)
template< class T > T* any_cast( any* operand ) noexcept;
(5) (начиная с C++17)

Выполняет типобезопасный доступ к содержащемуся объекту.

Пусть U будет std::remove_cv_t<std::remove_reference_t<T>>.

1) Программа некорректна, если std::is_constructible_v<T, const U&> равно false.
2) Программа некорректна, если std::is_constructible_v<T, U&> равно false.
3) Программа некорректна, если std::is_constructible_v<T, U> равно false.

Параметры

operand целевой объект any

Возвращаемое значение

1,2) Возвращает static_cast<T>(*std::any_cast<U>(&operand))
3) Возвращает static_cast<T>(std::move(*std::any_cast<U>(&operand))).
4,5) Если operand не является нулевым указателем и typeid запрошенного T совпадает с содержимым operand, возвращает указатель на значение, содержащееся в операнде, иначе нулевой указатель.

Исключения

1-3) Бросает std::bad_any_cast, если typeid запрошенного T не совпадает с содержимым operand.

Пример

#include <any>
#include <iostream>
#include <string>
#include <type_traits>
#include <utility>

int main()
{
    // Простой пример

    auto a1 = std::any(12);

    std::cout << "1) a1 равно int: " << std::any_cast<int>(a1) << '\n';

    try
    {
        auto s = std::any_cast<std::string>(a1); // бросает исключение
    }
    catch(const std::bad_any_cast& e)
    {
        std::cout << "2) " << e.what() << '\n';
    }

    // Пример указателя

    if (int* i = std::any_cast<int>(&a1))
    {
       std::cout << "3) a1 равно int: " << *i << '\n';
    }
    else if (std::string* s = std::any_cast<std::string>(&a1))
    {
       std::cout << "3) a1 равно std::string: " << *s << '\n';
    }
    else
    {
       std::cout << "3) a1 другого типа или не установлено\n";
    }

    // Расширенный пример

    a1 = std::string("привет");

    auto& ra = std::any_cast<std::string&>(a1); //< ссылка
    ra[1] = 'o';

    std::cout << "4) a1 равно string: "
              << std::any_cast<std::string const&>(a1) << '\n'; //< const ссылка

    auto s1 = std::any_cast<std::string&&>(std::move(a1)); //< rvalue ссылка

    // Примечание: s1 сконструированная перемещением std::string:
    static_assert(std::is_same_v<decltype(s1), std::string>);

    // Примечание: std::string в a1 остаётся в допустимом, но определённом состоянии.
    std::cout << "5) a1.size(): "
              << std::any_cast<std::string>(&a1)->size() //< указатель
              << '\n';

    std::cout << "6) s1: " << s1 << '\n';
}

Возможный вывод:

1) a1 равно int: 12
2) bad any_cast
3) a1 равно int: 12
4) a1 равно string: привет
5) a1.size(): 0
6) s1: привет