рд╕рдм рдХреБрдЫ рдЖрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ :: рдХреЛрдИ рднреА

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рд╣рдо рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреЗрд╢ "рд╕реА ++ 17 рд╕реЗ рдкрддрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдЖрдк рдХреА рдЬрд░реВрд░рдд рдПрд╕рдЯреАрдбреА рдмрд╛рд░реЗ рдореЗрдВ :: рдХрд┐рд╕реА рднреА" рджреНрд╡рд╛рд░рд╛ рдмрд╛рд░реНрдЯреНрд▓реЛрдорд┐рдПрдЬ Filipek ред рдЖрдк

рдЫрд╡рд┐

рдХреА рдорджрдж рд╕реЗ std::optionalрдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред std::variantрдЖрдк рдХреА рдорджрдж рд╕реЗ рдПрдХ рд╡рд╕реНрддреБ рдореЗрдВ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ C ++ 17 рд╣рдореЗрдВ рдПрдХ рдФрд░ рдРрд╕рд╛ рдЖрд╡рд░рдг рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ - std::anyрдЬреЛ рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░-рд╕реБрд░рдХреНрд╖рд┐рдд рд░рд╣рддреЗ рд╣реБрдП рдХреБрдЫ рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдореВрд▓ рдмрд╛рддреЗрдВ


рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, C ++ рдорд╛рдирдХ рдПрдХ рдЪрд░ рдореЗрдВ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдХрдИ рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ред рдмреЗрд╢рдХ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ void*, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред

рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, void*рдЖрдк рдЗрд╕реЗ рдПрдХ рдРрд╕реА рдХрдХреНрд╖рд╛ рдореЗрдВ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ , рдЬрд╣рд╛рдБ рдЖрдк рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рднрдВрдбрд╛рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

class MyAny
{
    void* _value;
    TypeInfo _typeInfo;
};

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореВрд▓ рд░реВрдк рдорд┐рд▓рд╛ рд╣реИ std::any, рд▓реЗрдХрд┐рди рдкреНрд░рдХрд╛рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП MyAnyрд╣рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдирд╛ рдирд┐рд░реНрдгрдп рд▓реЗрдВред

рдФрд░ рдпрд╣ рд╡рд╣ рд╣реИ std::anyрдЬреЛ C ++ 17 рд╕реЗ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреБрдЫ рднреА рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЬрдм рдЖрдк рдЧрд▓рдд рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ (рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ) рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред

рдереЛрдбрд╝рд╛ рдбреЗрдореЛ:

std::any a(12);

//    :
a = std::string("Hello!");
a = 16;
//   :

//    a  
std::cout << std::any_cast<int>(a) << '\n'; 

//    :
try 
{
    std::cout << std::any_cast<std::string>(a) << '\n';
}
catch(const std::bad_any_cast& e) 
{
    std::cout << e.what() << '\n';
}

//        - :
a.reset();
if (!a.has_value())
{
    std::cout << "a is empty!" << "\n";
}

//    any  :
std::map<std::string, std::any> m;
m["integer"] = 10;
m["string"] = std::string("Hello World");
m["float"] = 1.0f;

for (auto &[key, val] : m)
{
    if (val.type() == typeid(int))
        std::cout << "int: " << std::any_cast<int>(val) << "\n";
    else if (val.type() == typeid(std::string))
        std::cout << "string: " << std::any_cast<std::string>(val) << "\n";
    else if (val.type() == typeid(float))
        std::cout << "float: " << std::any_cast<float>(val) << "\n";
}

рдпрд╣ рдХреЛрдб рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдЧрд╛:

16
bad any_cast
a is empty!
float: 1
int: 10
string: Hello World

рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рддреЗрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

  • std::any тАФ std::optional std::variant
  • , .has_value()
  • .reset()
  • std::decay
  • ,
  • std::any_cast, bad_any_cast, ┬лT┬╗
  • .type(), std::type_info

рдКрдкрд░ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд▓рдЧрддрд╛ рд╣реИ - C ++ рдореЗрдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдЪрд░! рдпрджрд┐ рдЖрдк рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдмрд╣реБрдд рд╢реМрдХреАрди рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдиреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ std::anyрдФрд░ C ++ рдХреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ

рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ :) рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ?

рдХрдм рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ?


рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ void*рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрд╣реБрдд рд╣реА рд╕реАрдорд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдЪреАрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ std::anyрдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

  • рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ - рдЬрдм рдЖрдкрдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдХреБрдЫ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдпрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдбреЗрдЯрд╛ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
  • рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╕рдордп - рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  • рд╕рдВрджреЗрд╢
  • рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рднрд╛рд╖рд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди
  • рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рджреБрднрд╛рд╖рд┐рдпрд╛ рдмрдирд╛рдирд╛
  • рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ - рдлреАрд▓реНрдбреНрд╕ рдХреБрдЫ рднреА рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╣рдо рд╕рдорд░реНрдерд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдПрдХ рд╕реАрдорд┐рдд рд╕реВрдЪреА рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ std::variantрдПрдХ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдВрддрд┐рдо рдЙрддреНрдкрд╛рджреЛрдВ рдХреЛ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд┐рдирд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдмрдирд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдкрдХреЛ рдЕрднреА рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдВ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рднрдВрдбрд╛рд░рдг рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдкреНрд░рджрд░реНрд╢рди рдиреЗ рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рдЪреАрдЬреЗрдВ рджрд┐рдЦрд╛рдИрдВ, рд▓реЗрдХрд┐рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВрдЧреЗ std::any, рдЗрд╕рд▓рд┐рдП рдкрдврд╝рддреЗ рд░рд╣реЗрдВред

рдПрд╕рдЯреАрдбреА рдмрдирд╛рдПрдБ :: рдХреЛрдИ рднреА


рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ std::any:

  • рдорд╛рдирдХ рдЖрд░рдВрднреАрдХрд░рдг - рд╡рд╕реНрддреБ рдЦрд╛рд▓реА рд╣реИ
  • рдореВрд▓реНрдп / рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпрдХреНрд╖ рдЖрд░рдВрднреАрдХрд░рдг
  • рд╕реАрдзреЗ рд╡рд╕реНрддреБ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрдХреЗрдд - std::in_place_type
  • рдХреЗ рдЬрд░рд┐рдП std::make_any

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

//  :
std::any a;
assert(!a.has_value());

//   :
std::any a2(10); // int
std::any a3(MyType(10, 11));

// in_place:
std::any a4(std::in_place_type<MyType>, 10, 11);
std::any a5{std::in_place_type<std::string>, "Hello World"};

// make_any
std::any a6 = std::make_any<std::string>("Hello World");

рдмрджрд▓рддреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдмрджрд▓рддреЗ рдореВрд▓реНрдп, рдмрджрд▓рддреА рдХреАрдордд


рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рди std::anyрдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ: рд╡рд┐рдзрд┐ emplaceрдпрд╛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ:

std::any a;

a = MyType(10, 11);
a = std::string("Hello");

a.emplace<float>(100.5f);
a.emplace<std::vector<int>>({10, 11, 12, 13});
a.emplace<MyType>(10, 11);

рд╡рд╕реНрддреБ рдЬреАрд╡рди рдЪрдХреНрд░


рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдХреБрдВрдЬреА std::anyрд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд░рд┐рд╕рд╛рд╡ рдХреА рдХрдореА рд╣реИред рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ std::anyрдирдП рдореВрд▓реНрдп рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рднреА рд╕рдХреНрд░рд┐рдп рд╡рд╕реНрддреБ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрдЧрд╛ред

std::any var = std::make_any<MyType>();
var = 100.0f;
std::cout << std::any_cast<float>(var) << "\n";

рдпрд╣ рдХреЛрдб рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдЙрдЯрдкреБрдЯ рджреЗрдЧрд╛:

MyType::MyType
MyType::~MyType
100

рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ std::anyMyType рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдирдпрд╛ рдорд╛рди (100.0f) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ MyTypeред

рдХрд┐рд╕реА рдорд╛рди рдкрд░ рдкрд╣реБрдБрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛


рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдореВрд▓реНрдп рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реАрдХрд╛ рд╣реИ std::any- std::any_castрдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред

рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ:

  • рдорд╛рди рдХреА рдПрдХ рдкреНрд░рддрд┐ рд▓реМрдЯрд╛рдПрдВ рдФрд░ std::bad_any_castрддреНрд░реБрдЯрд┐ рдкрд░ рдЫреЛрдбрд╝ рджреЗрдВ
  • рдорд╛рди рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рд▓реМрдЯрд╛рдПрдВ рдФрд░ std::bad_any_cast рддреНрд░реБрдЯрд┐ рдкрд░ рдЫреЛрдбрд╝ рджреЗрдВ
  • рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдПрдХ рдорд╛рди (рд╕реНрдерд┐рд░ рдпрд╛ рдирд╣реАрдВ) рдпрд╛ рдирд▓реНрдЯреНрд░рдкреНрд░ рдкрд░ рд▓реМрдЯрд╛рдПрдВ

рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:

struct MyType
{
    int a, b;

    MyType(int x, int y) : a(x), b(y) { }

    void Print() { std::cout << a << ", " << b << "\n"; }
};

int main()
{
    std::any var = std::make_any<MyType>(10, 10);
    try
    {
        std::any_cast<MyType&>(var).Print();
        std::any_cast<MyType&>(var).a = 11; // /
        std::any_cast<MyType&>(var).Print();
        std::any_cast<int>(var); // throw!
    }
    catch(const std::bad_any_cast& e) 
    {
        std::cout << e.what() << '\n';
    }

    int* p = std::any_cast<int>(&var);
    std::cout << (p ? "contains int... \n" : "doesn't contain an int...\n");

    MyType* pt = std::any_cast<MyType>(&var);
    if (pt)
    {
        pt->a = 12;
        std::any_cast<MyType&>(var).Print();
    }
}

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ: рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ ( std::bad_any_cast) рдпрд╛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ (рдпрд╛ nullptr) рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдкрд░ред std::any_castрд▓реМрдЯрдиреЗ рд╡рд╛рд▓реЗ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдЕрддрд┐рднрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдЗрд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ noexceptред

рдкреНрд░рджрд░реНрд╢рди рдФрд░ рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ


std::anyрдпрд╣ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдЖрдк рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдЗрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдХреАрдордд рдХреНрдпрд╛ рд╣реИ?

рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рд╣реИред

std::variant рдФрд░ std::optionalрдХрд┐рд╕реА рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд╣рд▓реЗ рд╕реЗ рдЬреНрдЮрд╛рдд рд╣реИрдВред std :: рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдРрд╕реА рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдРрд╕рд╛ рд╣рдореЗрд╢рд╛ рдпрд╛ рдХрднреА-рдХрднреА рд╣реЛрдЧрд╛? рдХреМрди рд╕реЗ рдирд┐рдпрдо? рдХреНрдпрд╛ рдпрд╣ рднреА рдЗрдВрдЯ рдЬреИрд╕реЗ рд╕рд░рд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛?

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдорд╛рдирдХ рдХреНрдпрд╛ рдХрд╣рддрд╛ рд╣реИ:
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рдЫреЛрдЯреЗ рдирд┐рд╣рд┐рдд рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рд╕реНрдореГрддрд┐ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг: рдЬрд╣рд╛рдВ рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБ рдХреЗрд╡рд▓ рдПрдХ рдЗрдВрдЯ рдкрдХрдбрд╝ рд░рд╣реА рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдЫреЛрдЯреА-рд╡рд╕реНрддреБ рдЕрдиреБрдХреВрд▓рди рдХреЗрд╡рд▓ T рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реЛрдЧреА, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП is_nothrow_move_constructible_v рд╕рдЪ рд╣реИ
рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЫреЛрдЯреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдЧрддрд┐рд╢реАрд▓ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдХреЗрд╡рд▓ int рдХрд╛ рднрдВрдбрд╛рд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЫреЛрдЯреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдЕрдиреБрдХреВрд▓рди рдХреЗрд╡рд▓ T рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП is_nothrow_move_constructible_v рд╕рддреНрдп рд╣реИред

рдирддреАрдЬрддрди, рд╡реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЫреЛрдЯреЗ рдмрдлрд░ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди / рдПрд╕рдмреАрдУ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рднреА рдПрдХ рдХреАрдордд рд╣реИред рдпрд╣ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрдбрд╝рд╛ рдмрдирд╛рддрд╛ рд╣реИ - рдмрдлрд░ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдЖрдЗрдП рдЖрдХрд╛рд░ рджреЗрдЦреЗрдВ std::any, рдпрд╣рд╛рдВ рдХрдИ рд╕рдВрдХрд▓рдХ рдХреЗ рдкрд░рд┐рдгрд╛рдо рджрд┐рдП рдЧрдП рд╣реИрдВ:

рд╕рдВрдХрд▓рдХрдЖрдХрд╛рд░ (рдХреЛрдИ рднреА)
рдЬреАрд╕реАрд╕реА 8.1 (рдХреЛрд▓рд┐рд░реБ)рд╕реЛрд▓рд╣
рдХреНрд▓реИрдВрдЧ 7.0.0 (рд╡реИрдВрдбрдмреЙрдХреНрд╕)32
MSVC 2017 15.7.0 32-рдмрд┐рдЯ40
MSVC 2017 15.7.0 64-рдмрд┐рдЯ64

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, std::anyрдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЧрдд рд▓рд╛рддрд╛ рд╣реИред рдпрд╣ рдЖрдорддреМрд░ рдкрд░ SBO рдХреЗ рдХрд╛рд░рдг 16 рд╕реЗ 32 рдмрд╛рдЗрдЯреНрд╕ (GCC рдпрд╛ рдХреНрд▓реЗрдВрдЧ рдореЗрдВ ... рдпрд╛ MSVC рдореЗрдВ 64 рдмрд╛рдЗрдЯреНрд╕!) рдХреЗ рдХрд╛рд░рдг рдмрд╣реБрдд рд╕рд╛рд░реА рдореЗрдореЛрд░реА рд▓реЗрддрд╛ рд╣реИред

рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рд╕реЗ рдкрд▓рд╛рдпрди :: рдХреЛрдИ рднреА


boost::anyрдЗрд╕реЗ 2001 рдореЗрдВ рдХрд╣реАрдВ рднреА рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рд╕рдВрд╕реНрдХрд░рдг 1.23.0)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓реЗрдЦрдХ boost::any(рдХреЗрд╡рд▓рд┐рди рд╣реЗрдиреА) рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд▓реЗрдЦрдХ рд╣реИрдВ std::anyред рдЗрд╕рд▓рд┐рдП, рдпреЗ рджреЛ рдкреНрд░рдХрд╛рд░ рдмрд╛рд░реАрдХреА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ, рдПрд╕рдЯреАрдПрд▓ рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрдкрдиреЗ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред

рдпрд╣рд╛рдБ рдореБрдЦреНрдп рдкрд░рд┐рд╡рд░реНрддрди рд╣реИрдВ:

рд╕рдорд╛рд░реЛрд╣рдмреВрд╕реНрдЯ.рдПрдиреА
(1.67.0)
рдПрд╕рдЯреАрдбреА :: рдХреЛрдИ рднреА
рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдореГрддрд┐ рдЖрд╡рдВрдЯрдирд╣рд╛рдБрд╣рд╛рдБ
рдЫреЛрдЯреА рд╡рд╕реНрддреБ рдЕрдиреБрдХреВрд▓рдирдирд╣реАрдВрд╣рд╛рдБ
рдард╣рд░рдирд╛рдирд╣реАрдВрд╣рд╛рдБ
in_place_type_t рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВрдирд╣реАрдВрд╣рд╛рдБ


рдореБрдЦреНрдп рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ boost::anySBO рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдореЗрдореЛрд░реА рдХреЛ рдХрд╛рдлреА рдХрдо рд▓реЗрддрд╛ рд╣реИ (GCC8.1 рдореЗрдВ рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ 8 рдмрд╛рдЗрдЯреНрд╕ рд╣реИ), рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рд╡рдЬрд╣ рд╕реЗ, рдпрд╣ рдРрд╕реЗ рдЫреЛрдЯреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдЬреИрд╕реЗ int рдХреЗ рд▓рд┐рдП рднреА рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИред

Std :: any рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг


рдореБрдЦреНрдп рдкреНрд▓рд╕ std::anyрд▓рдЪреАрд▓рд╛рдкрди рд╣реИред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдЖрдк рдХреБрдЫ рд╡рд┐рдЪрд╛рд░реЛрдВ (рдпрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди) рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ std::anyрдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдлрд╝рд╛рдЗрд▓ рдкрд╛рд░реНрд╕рд┐рдВрдЧ


рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ std::variant ( рдЖрдк рдЙрдиреНрд╣реЗрдВ рдпрд╣рд╛рдБ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ [eng] ) рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ std::variantред рдЕрдм рдЖрдк рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛ, рддреЛ рдЖрдк рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реЛрдВрдЧреЗред рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП

рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ std::anyрдХрд░рдирд╛ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд╣реИ, рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЖрдкрдХреЛ рд╕рдорд╛рдзрд╛рди рдХрд╛ рд▓рдЪреАрд▓рд╛рдкрди рджреЗрддрд╛ рд╣реИред

рд╕рдВрджреЗрд╢


Windows Api рдореЗрдВ, рдЬреЛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ C рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ рдореИрд╕реЗрдЬрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╣реИ рдЬреЛ рдореИрд╕реЗрдЬ рдЖрдИрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рджреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореИрд╕реЗрдЬ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рддрдВрддреНрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдк WndProc рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЗ рд╡рд┐рдВрдбреЛ рдкрд░ рднреЗрдЬреЗ рдЧрдП рд╕рдВрджреЗрд╢ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред

LRESULT CALLBACK WindowProc(
  _In_ HWND   hwnd,
  _In_ UINT   uMsg,
  _In_ WPARAM wParam,
  _In_ LPARAM lParam
);

рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ wParamрдпрд╛ lParamрдЕрд▓рдЧ рдЕрд▓рдЧ рд░реВрдкреЛрдВ рдореЗрдВред рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ wParamред

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХреЗ?

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

class Message
{
public:
    enum class Type 
    {
        Init,
        Closing,
        ShowWindow,        
        DrawWindow
    };

public:
    explicit Message(Type type, std::any param) :
        mType(type),
        mParam(param)
    {   }
    explicit Message(Type type) :
        mType(type)
    {   }

    Type mType;
    std::any mParam;
};

class Window
{
public:
    virtual void HandleMessage(const Message& msg) = 0;
};

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рд╡рд┐рдВрдбреЛ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ:

Message m(Message::Type::ShowWindow, std::make_pair(10, 11));
yourWindow.HandleMessage(m);

рдПрдХ рдЦрд┐рдбрд╝рдХреА рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рд╕рдВрджреЗрд╢ рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд╕рдХрддреА рд╣реИ:

switch (msg.mType) {
// ...
case Message::Type::ShowWindow:
    {
    auto pos = std::any_cast<std::pair<int, int>>(msg.mParam);
    std::cout << "ShowWidow: "
              << pos.first << ", " 
              << pos.second << "\n";
    break;
    }
}

рдмреЗрд╢рдХ, рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреИрд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдЖрдк рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪрд╛рд▓ рдХреЗ рдмрдЬрд╛рдп рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЧреБрдг


рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЬреЛ C ++ (N1939) рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╡рд╕реНрддреБ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

struct property
{
    property();
    property(const std::string &, const std::any &);

    std::string name;
    std::any value;
};

typedef std::vector<property> properties;

рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рджрд┐рдЦрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдкрд╣рд▓рд╛ рдЬреЛ рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд╡рд╣ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдореИрдиреЗрдЬрд░ рдпрд╛ рдЧреЗрдо рдПрдбрд┐рдЯрд░ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред

рд╣рдо рд╕реАрдорд╛рдУрдВ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ


рдореЗрдВ рдЖрд░ / рд╕реАрдкреАрдкреА рд╡рд╣рд╛рдБ std :: рдХрд┐рд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдзрд╛рд░рд╛ рдерд╛ред рдФрд░ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдорд╣рд╛рди рдЯрд┐рдкреНрдкрдгреА рдереА рдЬреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдм рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рд╕реЗ :
рд▓рдмреНрдмреЛрд▓реБрдЖрдм рдпрд╣ рд╣реИ рдХрд┐ рдПрд╕рдЯреАрдбреА :: рдХреЛрдИ рднреА рдЖрдкрдХреЛ рд╕реАрдорд╛рдУрдВ рдХреЗ рдордирдорд╛рдиреЗ рдбреЗрдЯрд╛ рдкрд░ рдЕрдзрд┐рдХрд╛рд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рд╣реИ рд╕рдм рдХреБрдЫ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдХрд░реАрдм рд╣реИ:

  • рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ: рдЖрдкрдХреЛ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ
  • рдореИрд╕реЗрдЬрд┐рдВрдЧ: рдПрдХ рд╣реА рд╡рд┐рдЪрд╛рд░ - рдЧреНрд░рд╛рд╣рдХ рдХреЛ рд▓рдЪреАрд▓рд╛рдкрди рджреЗрдВ
  • рдлрд╝рд╛рдЗрд▓ рдкрд╛рд░реНрд╕рд┐рдВрдЧ: рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

рд╕рдВрдкреВрд░реНрдг


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рдмрд╣реБрдд рдХреБрдЫ рд╕реАрдЦрд╛ std::any!

рдпрд╣рд╛рдБ рдХреБрдЫ рдмрд╛рддреЛрдВ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рд╣реИ:

  • std::any рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреНрд▓рд╛рд╕ рдирд╣реАрдВ
  • std::any рдЫреЛрдЯреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╕рд░рд▓ рдкреНрд░рдХрд╛рд░ рдЬреИрд╕реЗ рдЗрдВрдЯ рдпрд╛ рдбрдмрд▓ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдФрд░ рдмрдбрд╝реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП, рдЕрддрд┐рд░рд┐рдХреНрдд рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
  • std::any "рднрд╛рд░реА" рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реБрд░рдХреНрд╖рд╛ рдФрд░ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛рдкрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ
  • рдбреЗрдЯрд╛ рдХреА рдкрд╣реБрдВрдЪ std::anyрдХреА рдорджрдж рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ any_cast, рдЬреЛ рдХрдИ "рдореЛрдб" рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдмрд╕ nullptr рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
  • рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд░реЗрдВ рдЬрдм рдЖрдкрдХреЛ рдкрддрд╛ рди рд╣реЛ рдХрд┐ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╕рдВрднрд╡ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ std::variant

All Articles