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

std::any_cast

Материал из cppreference.com
< cpp‎ | utility‎ | any
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, 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)
 
 
Определено в заголовочном файле <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(conststd::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';}elseif(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::stringconst&>(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: привет
close