... рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд░реНрдЧ рдХреИрд╕реЗ рднрд░реЗрдВ?
рдПрдХ рдмрд╛рд░ рдХрд╛рдлреА рд╕рдордп рдХреЗ рд▓рд┐рдП, рдбреА рднрд╛рд╖рд╛ рдХреЛ "рд╕рд╣реА рд╕реА ++" рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╕реА ++ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдЕрдиреБрднрд╡ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдПред рд╕рдордп рдХреЗ рд╕рд╛рде, D, C ++ рд╕реЗ рдХрдо рдЬрдЯрд┐рд▓ рдФрд░ рдЕрдзрд┐рдХ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рднрд╛рд╖рд╛ рдирд╣реАрдВ рдмрди рдЧрдпрд╛ рд╣реИред рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реА ++ рдбреА рдкрд░ рдЬрд╛рд╕реВрд╕реА рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реА ++ 17 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ if constexpr
, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдбреА рд╕реЗ рдкреНрд░рддреНрдпрдХреНрд╖ рдЙрдзрд╛рд░ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдбреА-рд╢рд░реНрдиреА рд╕реНрдерд┐рд░ рдерд╛ред
рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, if constexpr
C ++ рдореЗрдВ if constexpr
рдХреА рд╕рдорд╛рди рд╢рдХреНрддрд┐ рдирд╣реАрдВ рд╣реИ, static if
рдбреАред рдореЗрдВ рдЗрд╕рдХреЗ рдХрд╛рд░рдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрдм рдЖрдк рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рдд рдкрд░ рдкрдЫрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ if constexpr
C ++ рдореЗрдВ if constexpr
рдЖрдкрдХреЛ C + рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред + рд╡рд░реНрдЧред рдореИрдВ рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рдорд╛рдорд▓реЗ рдкрд░ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдПрдХ рдЦрд╛рдХрд╛ рд╡рд░реНрдЧ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рд╕рд╛рдордЧреНрд░реА (рдЕрд░реНрдерд╛рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдХреБрдЫ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рддрд░реНрдХ) рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рдереЗ, рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдХрд┐ SObjectizer рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрднрд╡ рд╕реЗ рд╣реИред
рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХрд╛рд░реНрдп
рд╕рдВрджреЗрд╢ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░" рдХрд╛ рдПрдХ рдЪрддреБрд░ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рддрд╛рдХрд┐ рдЖрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХреЗрдВ:
message_holder_t<my_message> msg{ new my_message{...} }; send(target, msg); send(another_target, msg);
рдЗрд╕ message_holder_t
рдХреНрд▓рд╛рд╕ рдХреА рдЯреНрд░рд┐рдХ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░рдХ рд╣реИрдВред
рд╕рдВрджреЗрд╢ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ?
рд╕рдВрджреЗрд╢ рдХреЗ рдкреНрд░рдХрд╛рд░ рдЬреЛ message_holder_t
рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рджреЛ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд╣рд▓рд╛ рд╕рдореВрд╣ рдРрд╕реЗ рд╕рдВрджреЗрд╢ рд╣реИрдВ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ message_t
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
struct so5_message final : public so_5::message_t { int a_; std::string b_; std::chrono::milliseconds c_; so5_message(int a, std::string b, std::chrono::milliseconds c) : a_{a}, b_{std::move(b)}, c_{c} {} };
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕рдВрджреЗрд╢_рдзрд╛рд░рдХ_ рдХреЗ рдЕрдВрджрд░ рдХреЗрд╡рд▓ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рд╣реА рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдЧреЗрдЯреНрдЯрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ message_t
рд╕реЗ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП message_t
рдРрд╕рд╛ рдХреБрдЫ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
template<typename M> class message_holder_t { intrusive_ptr_t<M> m_msg; public: ... const M * get() const noexcept { return m_msg.get(); } };
рджреВрд╕рд░рд╛ рд╕рдореВрд╣ рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдВрджреЗрд╢ рд╣реИ рдЬреЛ message_t
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓реЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
struct user_message final { int a_; std::string b_; std::chrono::milliseconds c_; user_message(int a, std::string b, std::chrono::milliseconds c) : a_{a}, b_{std::move(b)}, c_{c} {} };
SObjectizer рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реНрд╡рдпрдВ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд░рдг, user_type_message_t<M>
рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ message_t
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдРрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, message_holder_t
рдЗрд╕рдХреЗ рдЕрдВрджрд░ user_type_message_t<M>
рд╕реВрдЪрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ user_type_message_t<M>
рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ M рдХреЛ рдПрдХ рд╕реВрдЪрдХ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
template<typename M> class message_holder_t { intrusive_ptr_t<user_type_message_t<M>> m_msg; public: ... const M * get() const noexcept { return std::addressof(m_msg->m_payload); } };
рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдкреНрд░рддрд┐рд░рдХреНрд╖рд╛ рдпрд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛
рджреВрд╕рд░рд╛ рдХрд╛рд░рдХ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдФрд░ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рд╣реИред рдпрджрд┐ рд╕рдВрджреЗрд╢ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИ (рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИ), рддреЛ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЗрдЯреНрдЯрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдПрдХ рдирд┐рд░рдВрддрд░ рд╕реВрдЪрдХ рд▓реМрдЯрдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдЕрдЧрд░ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИ, рддреЛ рдЧреЗрдЯрд░реНрд╕ рдХреЛ рдПрдХ рдЧреИрд░-рд╕реНрдерд┐рд░ рдкреЙрдЗрдВрдЯрд░ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╛рдиреА рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
message_holder_t<so5_message> msg1{...};
shared_ptr рдмрдирд╛рдо unique_ptr
рддреАрд╕рд░рд╛ рдХрд╛рд░рдХ рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ message_holder_t
рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рддрд░реНрдХ рд╣реИред рдПрдХ рдмрд╛рд░ рдЗрд╕реЗ std::shared_ptr
, рдЬреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╕рдВрджреЗрд╢ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрдИ рд╕рдВрджреЗрд╢_рд╣реЛрд▓реНрдбрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдПрдХ рдмрд╛рд░ рдЗрд╕реЗ std::unique_ptr
, рдЬреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдореИрд╕реЗрдЬ_рд╣реЛрд▓реНрдбрд░ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдПрдХ рдореИрд╕реЗрдЬ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, message_holder_t
рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдВрджреЗрд╢ рдХреА рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ / рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╛рдиреА рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде, message_holder_t
рдХреЛ std::shared_ptr
рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП std::shared_ptr
рдФрд░ std::shared_ptr
std::unique_ptr
рдЬреИрд╕реЗ std::unique_ptr
:
message_holder_t<so5_message> msg1{...}; message_holder_t<so5_message> msg2 = msg;
рд▓реЗрдХрд┐рди рдЬреАрд╡рди рдПрдХ рдЬрдЯрд┐рд▓ рдЪреАрдЬ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ message_holder_t
рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рддрд╛рдХрд┐ рдЖрдк рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдореИрд╕реЗрдЬ_рд╣реЛрд▓реНрдбрд░ рдмрдирд╛ рд╕рдХреЗрдВ рдЬреЛ рдЕрдиреВрдареЗ_рдкреНрд░рд╛рдд рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред рдФрд░ рддрд╛рдХрд┐ рдЖрдк рдПрдХ рд╕рд╛рдЭрд╛ рд╕рдВрджреЗрд╢ рдХреЗ рд▓рд┐рдП message_holder рдмрдирд╛ рд╕рдХреЗрдВ рдЬреЛ рд╕рд╛рдЭрд╛_рдкреНрд░рд╛рдд рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ:
using unique_so5_message = so_5::message_holder_t< so5_message, so_5::message_ownership_t::unique>; unique_so5_message msg1{...}; unique_so5_message msg2 = msg1;
рддрджрдиреБрд╕рд╛рд░, рдЬрдм message_holder_t
рд╕рд╛рдЭрд╛_ptr рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдкрд╛рд╕ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдФрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдФрд░ рдЪрд╛рд▓ рджреЛрдиреЛрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдирд┐рд░рдВрддрд░ make_reference
рд╡рд┐рдзрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЬреЛ make_reference
рдЕрдВрджрд░ message_holder_t
рдкреЙрдЗрдВрдЯрд░ рдХреА рдХреЙрдкреА рд▓реМрдЯрд╛рддреА рд╣реИред
рд▓реЗрдХрд┐рди рдЬрдм message_holder_t
unique_ptr рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдХреЙрдкреА рдСрдкрд░реЗрдЯрд░ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ make_reference
рдореЗрдердб рдХреЛ message_holder_t
рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдкреЙрдЗрдВрдЯрд░ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП: make_reference
рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж make_reference
рдУрд░рд┐рдЬрд┐рдирд▓ message_holder_t
рдЦрд╛рд▓реА рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред
рддреЛ, рдЖрдкрдХреЛ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
template< typename M, message_ownership_t Ownership = message_ownership_t::autodetected> class message_holder_t {...};
рдЬрд┐рд╕рдореЗрдВ:
- рдЕрдВрджрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
intrusive_ptr_t<M>
рдпрд╛ intrusive_ptr<user_type_message_t<M>>
рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ M рдХреЛ message_t
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ; - рд╕рдВрджреЗрд╢ рдХреА рдкрд╛рд░рд╕реНрдкрд░рд┐рдХрддрд╛ / рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЧреЗрдЯ рдореЗрдердбреНрд╕ рдХреЛ рдпрд╛ рддреЛ
const M*
рдпрд╛ M*
рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛; - рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдХреЙрдкреА / рдореВрд╡ рдСрдкрд░реЗрдЯрд░реНрд╕ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рд╕реЗрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдХреЗрд╡рд▓ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдореВрд╡ рдСрдкрд░реЗрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП;
make_reference()
рд╡рд┐рдзрд┐ рдХреЛ рдпрд╛ рддреЛ рд╕рдВрдЧреНрд░рд╣реАрдд intrusive_ptr рдХреА рдПрдХ рдкреНрд░рддрд┐ рд╡рд╛рдкрд╕ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдЙрд╕реЗ intrusive_ptr рдХрд╛ рдорд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдореВрд▓ message_holder_t
рдЦрд╛рд▓реА рдЫреЛрдбрд╝ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, make_reference()
рдирд┐рд░рдВрддрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рджреВрд╕рд░реЗ рдореЗрдВ - рдЧреИрд░-рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ред
рд╕реВрдЪреА рд╕реЗ рдЕрдВрддрд┐рдо рджреЛ рдЖрдЗрдЯрдо рдУрдирд░рд╢рд┐рдк рдкреИрд░рд╛рдореАрдЯрд░ (рдФрд░ рд╕рд╛рде рд╣реА autodetected
рдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рд╕рдВрджреЗрд╢ рдХреА autodetected
) рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдпрд╣ рдХреИрд╕реЗ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛
рдЗрд╕ рдЦрдВрдб рдореЗрдВ, рд╣рдо рдЙрди рд╕рднреА рдШрдЯрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЕрдВрддрд┐рдо рд╕рдорд╛рдзрд╛рди рдмрдирд╛рддреЗ рд╣реИрдВред рдЦреИрд░, рдкрд░рд┐рдгрд╛рдореА рд╕рдорд╛рдзрд╛рди рдЦреБрджред рд╕рднреА рд╡рд┐рдЪрд▓рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рд╡рд░рдгреЛрдВ рд╕реЗ рд╕рд╛рдлрд╝ рдХрд┐рдП рдЧрдП рдХреЛрдб рдЕрдВрд╢ рджрд┐рдЦрд╛рдП рдЬрд╛рдПрдВрдЧреЗред рдпрджрд┐ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдпрд╣рд╛рдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рддреНрдпрд╛рдЧ
рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╕рдорд╛рдзрд╛рди рд╕реБрдВрджрд░, рдЖрджрд░реНрд╢ рдпрд╛ рд░реЛрд▓ рдореЙрдбрд▓ рд╣реЛрдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рдордп рд╕реАрдорд╛ рдХреЗ рджрдмрд╛рд╡ рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд, рдкрд░реАрдХреНрд╖рдг рдФрд░ рдкреНрд░рд▓реЗрдЦрд┐рддред рд╢рд╛рдпрдж рдЕрдЧрд░ рдЕрдзрд┐рдХ рд╕рдордп рдерд╛, рдФрд░ рдЕрдзрд┐рдХ рдПрдХ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдореЗрдВ рд▓рдЧреЗ рд╣реБрдП рдереЗ рдпреБрд╡рд╛ рдЖрдзреБрдирд┐рдХ рд╕реА ++ рдбреЗрд╡рд▓рдкрд░ рдореЗрдВ рд╕рдордЭрджрд╛рд░ рдФрд░ рдЬрд╛рдирдХрд╛рд░, рдпрд╣ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ, рд╕рд░рд▓ рдФрд░ рдЕрдзрд┐рдХ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдпрд╣ рд╣реБрдЖ ... "рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкрд┐рдпрд╛рдиреЛрд╡рд╛рджрдХ рдХреЛ рдЧреЛрд▓реА рдордд рдЪрд▓рд╛рдирд╛"ред
рдХрджрдо рдФрд░ рддреИрдпрд╛рд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЬрд╛рджреВ рдХреА рдЕрдиреБрдХреНрд░рдо
рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдХрдИ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрди рдХрд┐рдЯреЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╣реАрдВ рд╕реЗ рдЖрдиреА рдЪрд╛рд╣рд┐рдПред рдХрд╣рд╛рдБ рд╕реЗ?
рдбреА рдореЗрдВ, рд╣рдо static if
рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ static if
рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрдХреНрд╖рд╛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рднрд╛рдЧреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдХреБрдЫ рд░реВрдмреА рдореЗрдВ, рд╣рдо рд╢рд╛рдорд┐рд▓ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдорд┐рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ ред рд▓реЗрдХрд┐рди рд╣рдо C ++ рдореЗрдВ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдЕрдм рддрдХ рд╣рдорд╛рд░реА рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдмрд╣реБрдд рд╕реАрдорд┐рдд рд╣реИрдВ: рд╣рдо рдпрд╛ рддреЛ рд╕реАрдзреЗ рд╡рд░реНрдЧ рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╡рд┐рдзрд┐ / рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рд╣рдо рдХреБрдЫ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рдзрд┐ / рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдо рдХреБрдЫ рд╢рд░реНрдд рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд░реНрдЧ рдХреЗ рдЕрдВрджрд░ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ / рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ C ++ if constexpr
рдПрдХ D static if
ред рдирддреАрдЬрддрди, рдХреЗрд╡рд▓ рд╡рд┐рд░рд╛рд╕рдд рдмрдиреА рд╣реБрдИ рд╣реИред
Updред рдЬреИрд╕рд╛ рдХрд┐ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореБрдЭреЗ рдпрд╣рд╛рдВ рдЕрдзрд┐рдХ рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдмреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪреВрдВрдХрд┐ C ++ рдореЗрдВ SFINAE рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо SFINAE рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдХреНрд╖рд╛ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рдХреА рджреГрд╢реНрдпрддрд╛ рдХреЛ рд╕рдХреНрд╖рдо / рдЕрдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛рдиреА, static if
рд╕рдорд╛рди рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рд▓реЗрдХрд┐рди рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рджреЛ рдЧрдВрднреАрд░ рд╣реИрдВ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдХрдорд┐рдпреЛрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЕрдЧрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рддрд░реАрдХреЗ 1-2-3 рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди 4-5 рдпрд╛ рдЕрдзрд┐рдХ рд╣реИрдВ, рддреЛ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ SFINAE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдирд╛ рдердХрд╛рдК рд╣реИ, рдФрд░ рдпрд╣ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реЗ, SFINAE рд╣рдореЗрдВ рдХреНрд▓рд╛рд╕ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ (рдлрд╝реАрд▓реНрдбреНрд╕) рдХреЛ рдЬреЛрдбрд╝рдиреЗ / рд╣рдЯрд╛рдиреЗ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
C ++ рдореЗрдВ, рд╣рдо рдХрдИ рдЖрдзрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирд╕реЗ рд╣рдо рддрдм message_holder_t
рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░реЗрдВрдЧреЗред рдФрд░ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рдЪреБрдирд╛рд╡ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯреЗрдореНрдкрд▓реЗрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, std :: рд╕рд╢рд░реНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред
рд▓реЗрдХрд┐рди рдЪрд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЖрдзрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рд╡рд┐рд░рд╛рд╕рдд рдХреА рдПрдХ рдЫреЛрдЯреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИред рдЗрд╕рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рд╣реЛрдЧрд╛ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░реЗрдЧрд╛ рдЬреЛ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред рдЕрдЧрд▓рд╛ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╣реЛрдЧрд╛ рдЬреЛ "рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░" рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рддрд░реНрдХ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ред рдФрд░ рдлрд┐рд░ рдПрдХ рд╡рд░реНрдЧ рд╣реЛрдЧрд╛ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рдЧреЗрдЯрд░реНрд╕ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдХреНрд░рдо рдореЗрдВ рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд╡рд░реНрдЧреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рдЗрд╕ рддрдереНрдп рд╕реЗ рд╕рд░рд▓ рд╣реИ рдХрд┐ рд╕реЛрдмрд┐рдЬрд╛рдЗрдЬрд╝рд░ рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореИрдЬрд┐рдХ рд╣реИ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрджреЗрд╢ рдореИрд╕реЗрдЬ_рдЯ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ , рд╕рд╛рде рд╣реА рдореИрд╕реЗрдЬ рдореНрдпреВрдЯреЗрдмрд┐рд▓рд┐рдЯреА рдЪреЗрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╣реИ ред рдЗрд╕рд▓рд┐рдП, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╣рдо рдмрд╕ рдЗрд╕ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдЬрд╛рджреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рдо рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдЧреЛрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рдПрдВрдЧреЗред
рдЖрдо рд╕реВрдЪрдХ рднрдВрдбрд╛рд░рдг рдЖрдзрд╛рд░
рдЖрдЗрдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд intrusive_ptr рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рднреА рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА message_holder_t
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
template< typename Payload, typename Envelope > class basic_message_holder_impl_t { protected : intrusive_ptr_t< Envelope > m_msg; public : using payload_type = Payload; using envelope_type = Envelope; basic_message_holder_impl_t() noexcept = default; basic_message_holder_impl_t( intrusive_ptr_t< Envelope > msg ) noexcept : m_msg{ std::move(msg) } {} void reset() noexcept { m_msg.reset(); } [[nodiscard]] bool empty() const noexcept { return static_cast<bool>( m_msg ); } [[nodiscard]] operator bool() const noexcept { return !this->empty(); } [[nodiscard]] bool operator!() const noexcept { return this->empty(); } };
рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд░реНрдЧ рдХреЗ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВред рдкрд╣рд▓рд╛, рдкреЗрд▓реЛрдб, рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЧреЗрдЯреНрдЯрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрдмрдХрд┐ рджреВрд╕рд░рд╛, рд▓рд┐рдлрд╝рд╛рдлрд╝рд╛, intrusive_ptr рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрдм рд╕рдВрджреЗрд╢ рдкреНрд░рдХрд╛рд░ message_t
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ message_t
рддреЛ рдЗрди рджреЛрдиреЛрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╕рдорд╛рди рдореВрд▓реНрдп рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдпрджрд┐ рд╕рдВрджреЗрд╢ message_t
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ, рддреЛ рд╕рдВрджреЗрд╢ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреЗрд▓реЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ user_type_message_t<Payload>
рдХреЛ рд▓рд┐рдлрд╛рдлреЗ рдХреЗ рд░реВрдк рдореЗрдВ user_type_message_t<Payload>
рдЬрд╛рдПрдЧрд╛ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рд╡рд░реНрдЧ рдХреА рд╕рд╛рдордЧреНрд░реА рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рдЙрдард╛рддреА рд╣реИред рд▓реЗрдХрд┐рди рджреЛ рдмрд╛рддреЛрдВ рдкрд░ рдЕрд▓рдЧ рд╕реЗ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реВрдЪрдХ рдЦреБрдж, рдЕрд░реНрдерд╛рддреНред m_msg рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╡рд╛рд░рд┐рд╕реЛрдВ рддрдХ рдЗрд╕рдХреА рдкрд╣реБрдВрдЪ рд╣реЛред
рджреВрд╕рд░реЗ, рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП, рдХрдВрдкрд╛рдЗрд▓рд░ рд╣реА рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдХреЙрдкреА / рдСрдкрд░реЗрдЯ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕реНрддрд░ рдкрд░, рд╣рдо рдЕрднреА рддрдХ рдХреБрдЫ рднреА рдирд┐рд╖рд┐рджреНрдз рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рд╢реЗрдпрд░реНрдб_рдПрдкреНрдЯреНрд░ рдФрд░ рдпреВрдирд┐рдХ_рдкреНрд░реЗрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрдзрд╛рд░
рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдПрдХ рд╕рдВрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдЕрдм рд╣рдо рдЗрд╕рдХреЗ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░рд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдпрд╛ рддреЛ share_ptr рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ рдЕрдиреВрдареЗ_ptr рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВрдЧреЗред
рдЪрд▓рд┐рдП рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ_рд╢реЗрд╖ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдорд╛рдорд▓реЗ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣рд╛рдБ рд╕рдмрд╕реЗ рдХрдо рдХреЛрдб рд╣реИ:
template< typename Payload, typename Envelope > class shared_message_holder_impl_t : public basic_message_holder_impl_t<Payload, Envelope> { using direct_base_type = basic_message_holder_impl_t<Payload, Envelope>; public : using direct_base_type::direct_base_type; [[nodiscard]] intrusive_ptr_t< Envelope > make_reference() const noexcept { return this->m_msg; } };
рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ: basic_message_holder_impl_t
рд╕реЗ basic_message_holder_impl_t
, рдЗрд╕рдХреЗ рд╕рднреА basic_message_holder_impl_t
рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдФрд░ make_reference()
рдПрдХ рд╕рд░рд▓, рдЧреИрд░-рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЕрдиреВрдареЗ_ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдмрдбрд╝рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ:
template< typename Payload, typename Envelope > class unique_message_holder_impl_t : public basic_message_holder_impl_t<Payload, Envelope> { using direct_base_type = basic_message_holder_impl_t<Payload, Envelope>; public : using direct_base_type::direct_base_type; unique_message_holder_impl_t( const unique_message_holder_impl_t & ) = delete; unique_message_holder_impl_t( unique_message_holder_impl_t && ) = default; unique_message_holder_impl_t & operator=( const unique_message_holder_impl_t & ) = delete; unique_message_holder_impl_t & operator=( unique_message_holder_impl_t && ) = default; [[nodiscard]] intrusive_ptr_t< Envelope > make_reference() noexcept { return { std::move(this->m_msg) }; } };
рдлрд┐рд░, рд╣рдо basic_message_holder_impl_t
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ basic_message_holder_impl_t
рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рджреЗрддреЗ рд╣реИрдВ (рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИ)ред рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рд╣рдо рдпреВрдирд┐рдХ_рдкреНрд░реЗрдЯ рд▓реЙрдЬрд┐рдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдХреЙрдкреА / рдореВрд╡ рдСрдкрд░реЗрдЯрд░реНрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ: рд╣рдо рдирдХрд▓ рдкрд░ рд░реЛрдХ рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рд╣рдо рдЗрд╕ рдХрджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣рд╛рдВ рдПрдХ рд╡рд┐рдзреНрд╡рдВрд╕рдХ make_reference()
рд╡рд┐рдзрд┐ рднреА make_reference()
ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣реА рд╕рдм рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдЗрди рджреЛ рдЖрдзрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдмреАрдЪ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ ...
Share_ptr рдФрд░ unique_ptr рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмреАрдЪ рдЪрдпрди рдХрд░рдирд╛
Share_ptr рдФрд░ unique_ptr рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмреАрдЪ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдЯрд╛рдлрд╝рдВрдХреНрд╢рди (рдореЗрдЯрд╛рдлрд╝рдВрдХреНрд╢рди) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдВрдХрд▓рди рд╕рдордп рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде "рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ":
template< typename Msg, message_ownership_t Ownership > struct impl_selector { static_assert( !is_signal<Msg>::value, "Signals can't be used with message_holder" ); using P = typename message_payload_type< Msg >::payload_type; using E = typename message_payload_type< Msg >::envelope_type; using type = std::conditional_t< message_ownership_t::autodetected == Ownership, std::conditional_t< message_mutability_t::immutable_message == message_mutability_traits<Msg>::mutability, shared_message_holder_impl_t<P, E>, unique_message_holder_impl_t<P, E> >, std::conditional_t< message_ownership_t::shared == Ownership, shared_message_holder_impl_t<P, E>, unique_message_holder_impl_t<P, E> > >; };
рдпрд╣ рдореЗрдЯрд╛рдлрд╝рдВрдХреНрд╢рди рдореИрд╕реЗрдЬ_рд╣реЛрд▓реНрдбрд░_рдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реВрдЪреА рд╕реЗ рджреЛрдиреЛрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк (рдЬреЛ рдХрд┐ рдиреЗрд╕реНрдЯреЗрдб type
рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ), "рд░рд┐рдЯрд░реНрди" рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдпрд╣ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╛рдиреА рдпрд╛ рддреЛ shared_message_holder_impl_t
рдпрд╛ unique_message_holder_impl_t
ред
impl_selector
рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдВрджрд░ impl_selector
рдЖрдк рдКрдкрд░ рдмрддрд╛рдП рдЧрдП рдЬрд╛рджреВ рдХреЗ рдирд┐рд╢рд╛рди рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЬреЛ рд╣рдо рдЗрд╕рдореЗрдВ рдирд╣реАрдВ рдЧрдП: message_payload_type<Msg>::payload_type
, message_payload_type<Msg>::envelope_type
message_payload_type<Msg>::payload_type
рдФрд░ message_mutability_traits<Msg>::mutability
ред
рдФрд░ impl_selector
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП impl_selector
рдЖрд╕рд╛рди рдерд╛, рдлрд┐рд░ рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рдирд╛рдо рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ:
template< typename Msg, message_ownership_t Ownership > using impl_selector_t = typename impl_selector<Msg, Ownership>::type;
рдЧреЗрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдмреЗрд╕
рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЖрдзрд╛рд░ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдПрдХ "рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░" рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрдм рд╣рдореЗрдВ рдЧреЗрдЯ рдЖрдзрд╛рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдпрд╣ рдЖрдзрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ:
template< typename Base, typename Return_Type > class msg_accessors_t : public Base { public : using Base::Base; [[nodiscard]] Return_Type * get() const noexcept { return get_ptr( this->m_msg ); } [[nodiscard]] Return_Type & operator * () const noexcept { return *get(); } [[nodiscard]] Return_Type * operator->() const noexcept { return get(); } };
рдпрд╣ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдХрд╛ рдЕрд░реНрде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИред рдмреЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдКрдкрд░ рджрд┐рдЦрд╛рдП рдЧрдП impl_selector
рдореЗрдЯрд╛рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛ред рдпрд╛рдиреА рдмреЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╡рд╛рд░рд┐рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдпрджрд┐ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ unique_message_holder_impl_t
рд╕реЗ рдЖрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдХреЙрдкреА рдСрдкрд░реЗрдЯрд░ рдирд┐рд╖рд┐рджреНрдз рд╣реИрдВ, рддреЛ рдХрдВрдкрд╛рдЗрд▓рд░ msg_accessors_t
рд▓рд┐рдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдХреЙрдкреА рдСрдкрд░реЗрдЯрд░ рдирд╣реАрдВ рдмрдирд╛ msg_accessors_t
ред рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред
рд╕рдВрджреЗрд╢ рдХрд╛ рдкреНрд░рдХрд╛рд░, рд╕реВрдЪрдХ / рд▓рд┐рдВрдХ рдЬрд┐рд╕реЗ рдЧреЗрдЯрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╡рд╣ Return_Type рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛ред рдЪрд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ Msg
рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрджреЗрд╢ рдХреЗ рд▓рд┐рдП Msg
Return_Type рдкреИрд░рд╛рдореАрдЯрд░ Msg
рдХреЛ рдХрд╕рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЬрдмрдХрд┐ Msg
рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╕рдВрджреЗрд╢ рдХреЗ рд▓рд┐рдП Msg
рдкреИрд░рд╛рдореАрдЯрд░ Return_Type рдХреЗ рдорд╛рди рдХрд╛ рдорд╛рди Msg
ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, get()
const Msg*
get()
рд╡рд┐рдзрд┐ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП const Msg*
рдФрд░ Msg*
рд▓рд┐рдП рдмрд╕ Msg*
рд▓реМрдЯрд╛ рджреЗрдЧреАред
рдореБрдлреНрдд рдлрд╝рдВрдХреНрд╢рди get_ptr()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ get_ptr()
рдЙрди рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ message_t
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓реЗ рд╣реИрдВ:
template< typename M > M * get_ptr( const intrusive_ptr_t<M> & msg ) noexcept { return msg.get(); } template< typename M > M * get_ptr( const intrusive_ptr_t< user_type_message_t<M> > & msg ) noexcept { return std::addressof(msg->m_payload); }
рдпрд╛рдиреА рдпрджрд┐ рд╕рдВрджреЗрд╢ message_t
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ рдФрд░ user_type_message_t<Msg>
рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ, рддреЛ рджреВрд╕рд░рд╛ рдЕрдзрд┐рднрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдЕрдЧрд░ рдпрд╣ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рддреЛ рдкрд╣рд▓рд╛ рдЕрдзрд┐рднрд╛рд░ред
рдЧреЗрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрдзрд╛рд░ рдЪреБрдирдирд╛
рддреЛ, msg_accessors_t
рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдХреА рдЧрдгрдирд╛ impl_selector
рдореЗрдЯрд╛рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛рддреА рд╣реИред рд▓реЗрдХрд┐рди msg_accessors_t
рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░ msg_accessors_t
, рд╣рдореЗрдВ рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдорд╛рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдореЗрдЯрд╛рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИ:
template< message_mutability_t Mutability, typename Base > struct accessor_selector { using type = std::conditional_t< message_mutability_t::immutable_message == Mutability, msg_accessors_t<Base, typename Base::payload_type const>, msg_accessors_t<Base, typename Base::payload_type> >; };
рдЖрдк рдХреЗрд╡рд▓ Return_Type рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЧрдгрдирд╛ рдкрд░ рдзреНрдпрд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рдЙрди рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЬрд╣рд╛рдВ рдкреВрд░реНрд╡реА рдХрд╛рд╕реНрдЯ рдЙрдкрдпреЛрдЧреА рд╣реИ;)
рдареАрдХ рд╣реИ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рд╡рд┐рдХрд▓реНрдк:
template< message_mutability_t Mutability, typename Base > using accessor_selector_t = typename accessor_selector<Mutability, Base>::type;
рдЕрдВрддрд┐рдо рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рд╕рдВрджреЗрд╢_рдзрд╛рд░рдХ_t
рдЕрдм рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ message_holder_t
рдХреНрдпрд╛ message_holder_t
, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЗрди рд╕рднреА рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдФрд░ рдореЗрдЯрд╛рдлреИрдХреНрд╢рдВрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА (рдореИрд╕реЗрдЬ_рд╣реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦреЗ рдЧрдП рдореИрд╕реЗрдЬ рдХреА рдПрдХ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ):
template< typename Msg, message_ownership_t Ownership = message_ownership_t::autodetected > class message_holder_t : public details::message_holder_details::accessor_selector_t< details::message_mutability_traits<Msg>::mutability, details::message_holder_details::impl_selector_t<Msg, Ownership> > { using base_type = details::message_holder_details::accessor_selector_t< details::message_mutability_traits<Msg>::mutability, details::message_holder_details::impl_selector_t<Msg, Ownership> >; public : using payload_type = typename base_type::payload_type; using envelope_type = typename base_type::envelope_type; using base_type::base_type; friend void swap( message_holder_t & a, message_holder_t & b ) noexcept { using std::swap; swap( a.message_reference(), b.message_reference() ); } };
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдордиреЗ рдЬреЛ рдХреБрдЫ рднреА рдКрдкрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдерд╛, рдЙрд╕реЗ рджреЛ рдореЗрдЯрд╛рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЗрд╕ "рдХреЙрд▓" рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдерд╛:
details::message_holder_details::accessor_selector_t< details::message_mutability_traits<Msg>::mutability, details::message_holder_details::impl_selector_t<Msg, Ownership> >
рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рдХреЗ рд╕рд░рд▓реАрдХрд░рдг рдФрд░ рдХрдореА рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ, рдореИрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрдЯрд╛рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЙрдореНрдкреИрдХреНрдЯ рд░реВрдк рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреА рд╡реНрдпрд╛рдкрдХрддрд╛ рдХреЛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ (рдпрджрд┐ рдЖрдо рддреМрд░ рдкрд░ рдпрд╣рд╛рдВ рд╕рдордЭ рдХреА рдмрд╛рдд рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ)ред
рдФрд░ рдЕрдЧрд░ рд╣реЛрддрд╛ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ ...
рд▓реЗрдХрд┐рди рдЕрдЧрд░ C ++ рдореЗрдВ if constexpr
рдЬрд┐рддрдирд╛ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реЛрддрд╛, static if
рдбреА рдореЗрдВ рд╣реЛрддрд╛, рддреЛ рдЖрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рдереЗ:
рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрдкреЛрдереЗрдЯрд┐рдХрд▓ рд╕рдВрд╕реНрдХрд░рдг рдЕрдЧрд░ рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдк template< typename Msg, message_ownership_t Ownership = message_ownership_t::autodetected > class message_holder_t { static constexpr const message_mutability_t Mutability = details::message_mutability_traits<Msg>::mutability; static constexpr const message_ownership_t Actual_Ownership = (message_ownership_t::unique == Ownership || (message_mutability_t::mutable_msg == Mutability && message_ownership_t::autodetected == Ownership)) ? message_ownership_t::unique : message_ownership_t::shared; public : using payload_type = typename message_payload_type< Msg >::payload_type; using envelope_type = typename message_payload_type< Msg >::envelope_type; private : using getter_return_type = std::conditional_t< message_mutability_t::immutable_msg == Mutability, payload_type const, payload_type >; public : message_holder_t() noexcept = default; message_holder_t( intrusive_ptr_t< envelope_type > mf ) noexcept : m_msg{ std::move(mf) } {} if constexpr(message_ownership_t::unique == Actual_Ownership ) { message_holder_t( const message_holder_t & ) = delete; message_holder_t( message_holder_t && ) noexcept = default; message_holder_t & operator=( const message_holder_t & ) = delete; message_holder_t & operator=( message_holder_t && ) noexcept = default; } friend void swap( message_holder_t & a, message_holder_t & b ) noexcept { using std::swap; swap( a.m_msg, b.m_msg ); } [[nodiscard]] getter_return_type * get() const noexcept { return get_const_ptr( m_msg ); } [[nodiscard]] getter_return_type & operator * () const noexcept { return *get(); } [[nodiscard]] getter_return_type * operator->() const noexcept { return get(); } if constexpr(message_ownership_t::shared == Actual_Ownership) { [[nodiscard]] intrusive_ptr_t< envelope_type > make_reference() const noexcept { return m_msg; } } else { [[nodiscard]] intrusive_ptr_t< envelope_type > make_reference() noexcept { return { std::move(m_msg) }; } } private : intrusive_ptr_t< envelope_type > m_msg; };
, . C++ :(
( C++ "" ).
, , ++. , , , . , message_holder_t
. , , if constexpr
.
рдирд┐рд╖реНрдХрд░реНрд╖
, C++. , . , , .
, .
, , ++ , . , . , , . , . C++98/03 , C++11 .