std::any::type
De cppreference.com
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.
Ejecuta este código
#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) |