std::any_cast
Материал из cppreference.com
Определено в заголовочном файле <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>>.
Содержание |
[править]Параметры
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, возвращает указатель на значение, содержащееся в операнде, иначе нулевой указатель.
[править]Исключения
[править]Пример
Запустить этот код
#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: привет