Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::any::type

      From cppreference.com
      <cpp‎ |utility‎ |any
       
       
      Utilities library
       
       
      conststd::type_info& type()constnoexcept;
      (since C++17)

      Queries the contained type.

      [edit]Return value

      Thetypeid of the contained value if instance is non-empty, otherwisetypeid(void).

      [edit]Example

      The example demonstratesstd::any visitor idiom with ability to register new visitors at compile- and run-time.

      Run this code
      #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

      [edit]See also

      (C++11)
      wrapper around atype_info object, that can be used as index in associative and unordered associative containers
      (class)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/utility/any/type&oldid=179372"

      [8]ページ先頭

      ©2009-2025 Movatter.jp