рд╕реА ++ рдХреЗ рдореБрд╣рд╛рд╡рд░реЗред рдкреНрд░рдХрд╛рд░ рдорд┐рдЯрд╛рдирд╛

рдХреИрд╕реЗ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рдПрдХ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ :: рдХрд╛рд░реНрдп , рдмрдврд╝рд╛рд╡рд╛ :: рдХрд┐рд╕реА рднреА "рд╣реБрдб рдХреЗ рддрд╣рдд" рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдкрддрд╛ рд▓рдЧрд╛рдПрдБ рдпрд╛ рддрд╛рдЬрд╝рд╛ рдХрд░реЗрдВ рдХрд┐ рдЕрд╕реНрдкрд╖реНрдЯ рд╡рд╛рдХреНрдпрд╛рдВрд╢ "рдЯрд╛рдЗрдк рдЗрд░реЗрдЬрд╝рд░" рдХреЗ рдкреАрдЫреЗ рдХреНрдпрд╛ рдЫрд┐рдкрд╛ рд╣реИ? рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЗрд╕ рдореБрд╣рд╛рд╡рд░реЗ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдкреНрд░рдореБрдЦ рддрддреНрд╡реЛрдВ рдХреЗ рдкреАрдЫреЗ рдХреА рдкреНрд░реЗрд░рдгрд╛ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ред

рдкреНрд░реЗрд░рдгрд╛


рдПрдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдЕрд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХреИрд╕реЗ рд░рдЦрд╛ рдЬрд╛рдП? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдХрд▓реНрдк рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реЗ рддреБрд░рдВрдд рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ "рд╡рд┐рдШрдЯрд┐рдд" рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдПрдХрд▓ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╛ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╕реНрддреБ "рдХреБрдЫ" рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рд╕рдВрдЧреНрд░рд╣реАрдд "рдХреБрдЫ" рдкрд░ "()" рдСрдкрд░реЗрдЯрд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐? рдХреИрд╕реЗ, рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд╕реНрддреБ рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкрд╛рдХрд░, рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ "рдорд┐рдЯрд╛рдирд╛"?

рд╢реВрдиреНрдп *


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, C ++ рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рддрдВрддреНрд░ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреАрдЫреЗ рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ C рдкреЙрдЗрдВрдЯрд░ рд╢реВрдиреНрдп * рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
struct A{ void foo(); }; struct B{ int bar(double); }; A a; B b; std::vector<void*> v; v.push_back(&a); v.push_back(&b); static_cast<A*>(v[0])->foo(); static_cast<B*>(v[1])->bar(3.5); 


рдпрд╛ рддреЛ:
 class void_any { public: void_any(const void* h, size_t size) : size_(size) { h_ = std::malloc(size); std::memcpy(h_, h, size); } void get(void*& h) { h = std::malloc(size_); std::memcpy(h, h_, size_); } ~void_any(){ std::free(h_); } private: size_t size_; void* h_; }; int some_int=675321; void_any va(&some_int, sizeof(int)); void* pi; va.get(pi); std::cout << *(int*)pi << std::endl; 


рдРрд╕реА рдпреЛрдЬрдирд╛ рдХрд╛рдо рдХрд░реЗрдЧреА, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдиреБрдХрд╕рд╛рди рд╕реНрдкрд╖реНрдЯ рд╣реИрдВред рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рдЖрдк рдПрдХ рдЧрд▓рддреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЧрд▓рдд рдЖрдХрд╛рд░ рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ rvalue рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдпрд╣ рдпрд╛рдж рджрд┐рд▓рд╛рддреЗ рд╣реИрдВ рдХрд┐ рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдЯреЛрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ "рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ" рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реИред рдЦреИрд░, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рджреЛрд╖, рд╢рд╛рдпрдж рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЬрд┐рд╕ рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдкреЗрдЪрдХрд╢ рдХреЗ рд╕рд╛рде рдПрдХ рдХреАрд▓ рдХреЛ рд╣рдереМрдбрд╝рд╛ рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реИред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рддреЛ рдХреНрдпрд╛ рдХрд░реЗрдВ?

рдкреИрдЯрд░реНрди рдФрд░ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо


рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рдЪреБрдХреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд╣рд╛рдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ (рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдлрдВрдХреНрд╢рди) рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЫрд┐рдкрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЕрд░реНрдерд╛рдд, рд╕рдорд╛рди рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреАрдЫреЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдЫрд┐рдкрд╛рдПрдЧрд╛ред
 template <typename T> struct some_t{}; some_t<int> s1; some_t<double> s2; 

рдКрдкрд░ рдХреЗ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ, s1 рдФрд░ s2 рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХреЗ рдмрд╛рдж рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ, рдЕрд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, C ++ рд╕рд┐рд░реНрдл рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИред рдФрд░ рд╡рд┐рд░рд╛рд╕рдд рдФрд░ рдЧрддрд┐рд╢реАрд▓ рдмрд╣реБрд░реВрдкрддрд╛ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрдПрдЧреАред рдХреИрд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓рд╛ рднрд╛рдЧ рдкрдврд╝реЗрдВред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рддреЛ, рд╢рдмреНрджреЛрдВ рд╕реЗ рдХрд╛рд░реНрд░рд╡рд╛рдИ рддрдХред рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ "рдЖрд╡рд░рдг" рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдХреИрд╕реЗ рд╕рдВрднрд╡ рд╣реИ? рдпрд╣ рд╕рд╣реА рд╣реИ, рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
 class any { public: template<typename T> any(const T& t); //тАж }; 

рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рдХреИрд╕реЗ рдмрдЪрд╛ рдЬрд╛рдП рдХрд┐ рд╣рдореЗрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдХреНрдпрд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛? рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреЛ рдЯреА рдЯрд╛рдЗрдк рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рддрд░рд╣ рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
 class any { //... private: T t_; }; 

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕реВрдЪрдХ рдХреЛ рдПрдХ рд╕рд╛рд░ рд╕рд╣рд╛рдпрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЗрд╕реЗ рд╣рдореЗрдВ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЯреА рдореЗрдВ рджреЗ рджреЗрдВрдЧреЗ, рд╣рдо рдЗрд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЗ рджреЗрдВрдЧреЗ рдЬреЛ рд╕рд╛рд░ рд╕рд╣рд╛рдпрдХ рдЖрдзрд╛рд░ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИред

 class any { public: any(const T& t) : held_(new holder<T>(t)){} //тАж private: struct base_holder { virtual ~base_holder(){} }; template<typename T> struct holder : base_holder { holder(const T& t) : t_(t){} T t_; }; private: base_holder* held_; }; 

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! рдЕрдм рд╣рдо рдХрдХреНрд╖рд╛ "рдХрд┐рд╕реА рднреА" рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдорд╛рдорд▓рд╛ рдЫреЛрдЯрд╛ рд╣реИ, рдЕрдм рдмрдЪрд╛рдИ рдЧрдИ рд╡рд╕реНрддреБ рдХреЛ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рд╣рдорд╛рд░реЗ рд░реИрдкрд░ рдХреЗ рдЖрдВрддреНрд░ рд╕реЗ "рдирд┐рдХрд╛рд▓" рд▓рд┐рдпрд╛ рдЬрд╛рдПред рдЗрд╕рдХреЗ рд▓рд┐рдП, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдореЗрдВ RTTI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рд╕рд╣рд╛рдпрдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдореВрд▓реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИред

 struct base_holder { //... virtual const std::type_info& type_info() const = 0; }; template<typename T> struct holder : base_holder { //... const std::type_info& type_info() const { return typeid(t_); } }; 

рдЕрдм рдореВрд▓ рд╡рд╕реНрддреБ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред

 template<typename U> U cast() const { if(typeid(U) != held_->type_info()) throw std::runtime_error("Bad any cast"); return static_cast<holder<U>* >(held_)->t_; } 


рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ RTTI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдХреНрдпреЛрдВрдХрд┐, рдореИрдВ рд╕рдордп рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдЬрд╛рдБрдЪ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛:
 U cast(typename std::enable_if<std::is_same<U, decltype( static_cast<holder<U>* >(held_)->t_)>::value>::type* = 0) const { return static_cast<holder<U>* >(held_)->t_; } 


рдпрд╣ рд╕рдорд╛рдзрд╛рди рдЙрдкрдпреБрдХреНрдд рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ? рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐
 std::is_same<U, decltype(static_cast<holder<U>* >(held_)->t_)>::value 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдореЗрд╢рд╛ рд╕рд╣реА рд░рд╣реЗрдЧрд╛, рднрд▓реЗ рд╣реА рдзрд╛рд░рдХ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛред рдРрд╕рд╛ рдХреЛрдб рд╕рдВрдХрд▓рди рдХрд░реЗрдЧрд╛ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХреНрд░реИрд╢ рдХреЗ рдмрд┐рдирд╛ рднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ (рдпрджрд┐ рдЖрдк рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд╣реИрдВ)
 any a(2); a.cast<std::string>(); 

рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдВрдЧреЗ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЙрдореНрдореАрдж рд╣реИред

рдмреВрд╕реНрдЯ :: рдлрдВрдХреНрд╢рди рдХреНрд▓рд╛рд╕ рдЯрд╛рдЗрдк рдЗрд░реЗрдЬрд╝рд░ рдХреЗ рдПрдХ рд╣реА рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдХреЙрд╕реНрдореЗрдЯрд┐рдХ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рддрд░реНрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕рд╣рд╛рдпрдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ
 virtual return_type operator()(arg_type1, .., arg_typeN); 


рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ



 class any { public: template<typename T> any(const T& t) : held_(new holder<T>(t)){} ~any(){ delete held_; } template<typename U> U cast() const { if(typeid(U) != held_->type_info()) throw std::runtime_error("Bad any cast"); return static_cast<holder<U>* >(held_)->t_; } private: struct base_holder { virtual ~base_holder(){} virtual const std::type_info& type_info() const = 0; }; template<typename T> struct holder : base_holder { holder(const T& t) : t_(t){} const std::type_info& type_info() const { return typeid(t_); } T t_; }; private: base_holder* held_; }; int main() { any a(2); std::cout << a.cast<int>() << std::endl; any b(std::string("abcd")); try { std::cout << b.cast<double>() << std::endl; } catch(const std::exception& e) { std::cout << e.what() << std::endl; } return 0; } 

Source: https://habr.com/ru/post/In207294/


All Articles