Espacios de nombres
Variantes
Acciones

std::any::type

De cppreference.com
< cpp‎ | utility‎ | any
 
 
Biblioteca de servicios
 
 
conststd::type_info& type()constnoexcept;
(desde C++17)

Consulta el tipo contenido.

Contenido

[editar]Parámetros

(Ninguno)

[editar]Valor de retorno

El typeid del valor contenido si la instancia no está vacía; de lo contrario, typeid(void).

[editar]Ejemplo

El ejemplo demuestra el modismo del visitador std::any con la habilidad de registrar nuevos visitadores en tiempos de compilación y ejecución.

#include <type_traits>#include <any>#include <functional>#include <iomanip>#include <iostream>#include <typeindex>#include <typeinfo>#include <unordered_map>#include <vector>   template<class T, class F>inlinestd::pair<conststd::type_index, std::function<void(std::anyconst&)>> to_any_visitor(F const&f){return{std::type_index(typeid(T)), [g = f](std::anyconst&a){ifconstexpr(std::is_void_v<T>) g();else g(std::any_cast<T const&>(a));}};}   staticstd::unordered_map<std::type_index, std::function<void(std::anyconst&)>> any_visitor { to_any_visitor<void>([]{std::cout<<"{}";}), to_any_visitor<int>([](int x){std::cout<< x;}), to_any_visitor<unsigned>([](unsigned x){std::cout<< x;}), to_any_visitor<float>([](float x){std::cout<< x;}), to_any_visitor<double>([](double x){std::cout<< x;}), to_any_visitor<charconst*>([](charconst*s){std::cout<<std::quoted(s);}), // ... agregar más controladores para tus tipos ...};   inlinevoid process(conststd::any& a){if(constauto it = any_visitor.find(std::type_index(a.type())); it != any_visitor.cend()){ it->second(a);}else{std::cout<<"Tipo no registrado "<<std::quoted(a.type().name());}}   template<class T, class F>inlinevoid register_any_visitor(F const& f){std::cout<<"Registrar visitador para el tipo "<<std::quoted(typeid(T).name())<<'\n'; any_visitor.insert(to_any_visitor<T>(f));}   auto main()->int{std::vector<std::any> va {{}, 42, 123u, 3.14159f, 2.71828, "C++17", };   std::cout<<"{ ";for(conststd::any& a : va){ process(a);std::cout<<", ";}std::cout<<"}\n";   process(std::any(0xFULL));//< Tipo no registrado "y" (unsigned long long)std::cout<<'\n';   register_any_visitor<unsignedlonglong>([](auto x){std::cout<<std::hex<<std::showbase<< x;});   process(std::any(0xFULL));//< de acuerdo: 0xfstd::cout<<'\n';}

Posible salida:

{ {}, 42, 123, 3.14159, 2.71828, "C++17", } Tipo no registrado "y" Registrar visitador para el tipo "y" 0xf

[editar]Véase también

(C++11)
Envoltura alrededor de un objeto type_info, que se puede utilizar como un subíndice en contenedores asociativos y contenedores asociativos no ordenados.
(clase)[editar]
close