|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
conststd::type_info& type()constnoexcept; | (since C++17) | |
Queries the contained type.
Thetypeid of the contained value if instance is non-empty, otherwisetypeid(void).
The example demonstratesstd::any visitor idiom with ability to register new visitors at compile- and run-time.
#include <any>#include <functional>#include <iomanip>#include <iostream>#include <type_traits>#include <typeindex>#include <typeinfo>#include <unordered_map>#include <vector> template<class T,class F>inlinestd::pair<conststd::type_index,std::function<void(conststd::any&)>> to_any_visitor(const F& f){return{std::type_index(typeid(T)),[g= f](std::anyconst& a){ifconstexpr(std::is_void_v<T>) g();else g(std::any_cast<Tconst&>(a));}};} staticstd::unordered_map<std::type_index,std::function<void(conststd::any&)>> 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);}),// ... add more handlers for your types ...}; inlinevoid process(conststd::any& a){if(constauto it= any_visitor.find(std::type_index(a.type())); it!= any_visitor.cend()) it->second(a);elsestd::cout<<"Unregistered type "<<std::quoted(a.type().name());} template<class T,class F>inlinevoid register_any_visitor(const F& f){std::cout<<"Register visitor for type "<<std::quoted(typeid(T).name())<<'\n'; any_visitor.insert(to_any_visitor<T>(f));} int main(){std::vector<std::any> va{{},42, 123u,3.14159f,2.71828,"C++17"}; for(int n{};conststd::any& a: va){std::cout<<(n++?", ":"["); process(a);}std::cout<<"]\n"; process(std::any(0xFULL));//< Unregistered type "y" (unsigned long long)std::cout<<'\n'; register_any_visitor<unsignedlonglong>([](auto x){std::cout<<std::hex<<std::showbase<< x;}); process(std::any(0xFULL));//< OK: 0xfstd::cout<<'\n';}
Possible output:
[{}, 42, 123, 3.14159, 2.71828, "C++17"]Unregistered type "y"Register visitor for type "y"0xf(C++11) | wrapper around atype_info object, that can be used as index in associative and unordered associative containers(class)[edit] |