рд╕рдВрдХрд▓рди рд╕рдордп рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП C ++ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореИрдЬрд┐рдХ рдФрд░ CRTP рдХрд╛ рдПрдХ рд╕рд╛

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рд╕реЛрдмрд┐рдЬрд╛рдЗрдЬрд╝рд░ рдХреЗ рдПрдХ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдореБрдЭреЗ рд╕рдВрдХрд▓рди рд╕рдордп рдореЗрдВ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рд▓рдмреНрдмреЛрд▓реБрдЖрдм рдпрд╣ рдерд╛ рдХрд┐ рдкрд╣рд▓реЗ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдлреЙрд░реНрдо рдХреА рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рдерд╛:


receive(from(ch).empty_timeout(150ms), ...); receive(from(ch).handle_n(2).no_wait_on_empty(), ...); receive(from(ch).empty_timeout(2s).extract_n(20).stop_on(...), ...); receive(from(ch).no_wait_on_empty().stop_on(...), ...); 

рдкреНрд░рд╛рдкреНрдд () рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреИрд╕реЗ рдХрд┐ рдКрдкрд░ from(ch).empty_timeout(150ms) рдпрд╛ from(ch).handle_n(2).no_wait_on_empty() from(ch).empty_timeout(150ms) рдКрдкрд░ рджрд┐рдЦрд╛рдП рдЧрдПред рдЙрд╕реА рд╕рдордп, рд╣реИрдВрдбрд▓_ рдПрди () / рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯ_рдПрди () рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛, рдЬреЛ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ / рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╡реИрдХрд▓реНрдкрд┐рдХ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдКрдкрд░ рджрд┐рдЦрд╛рдП рдЧрдП рд╕рднреА рдЪреЗрди рд╕рд╣реА рдереЗред


рд▓реЗрдХрд┐рди рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдФрд░ / рдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдпрд╛рдиреА from(ch).empty_timeout(150ms) рдлрд╝реЙрд░реНрдо рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЕрдм рдЧрд▓рдд рд╣реЛ рдЧрдИ рд╣реИред рдЗрд╕реЗ from(ch).handle_all().empty_timeout(150ms) рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдФрд░ рдореИрдВ рдЗрд╕реЗ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рддрд╛рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рд╣рд╛рде рд╕реЗ рдорд╛рд░ рджреЗ рдЕрдЧрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реИрдВрдбрд▓_рд▓ (), рд╣реИрдВрдбрд▓_ рдПрди (рдпрд╛ рдЕрд░реНрдХ_ рдПрди) рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛ред


рдХреНрдпрд╛ C ++ рдЗрд╕рдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ?


рд╣рд╛рдВред рдФрд░ рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рдХреИрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред


рдПрдХ рдкреНрд░рд╛рдкреНрдд () рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ


рдкреНрд░рд╛рдкреНрдд () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдХреЙрд▓ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ (рдЬрд┐рд╕реЗ рдмрд┐рд▓реНрдбрд░ рдкреИрдЯрд░реНрди рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдПрдХ рдЪреБрдирд┐рдВрджрд╛ () рдлрд╝рдВрдХреНрд╢рди рднреА рдерд╛, рдЬрд┐рд╕реЗ рд▓рдЧрднрдЧ рд╕рдорд╛рди рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╕реЗрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рдерд╛:


 select(from_all().empty_timeout(150ms), case_(...), case_(...), ...); select(from_all().handle_n(2).no_wait_on_empty(), case_(...), case_(...), ...); select(from_all().empty_timeout(2s).extract_n(20).stop_on(...), case_(...), case_(...), ...); select(from_all().no_wait_on_empty().stop_on(...), case_(...), case_(...), ...); 

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


рд╕рдВрднрд╡ рд╕рдорд╛рдзрд╛рди


рдЗрд╕рд▓рд┐рдП, рдХрд╛рд░реНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╣реИ рдЕрд╕рдлрд▓ рдХреЗ рдмрд┐рдирд╛ handle_all (), handle_n () рдпрд╛ extract_n () рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред


рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдХрд┐рд╕реА рднреА рдЬрдЯрд┐рд▓ рдирд┐рд░реНрдгрдпреЛрдВ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЪрдпрди () рдФрд░ рдкреНрд░рд╛рдкреНрдд () рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рджрд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 receive(handle_all(), from(ch).empty_timeout(150ms), ...); select(handle_n(20), from_all().no_wait_on_empty(), ...); 

рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ () / рдЪрдпрди () рдЕрд▓рдЧ рд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВ:


 receive(handle_all(from(ch).empty_timeout(150ms)), ...); select(handle_n(20, from_all().no_wait_on_empty()), ...); 

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


 receive(from(ch).handle_n(2).no_wait_on_empty(), ...); select(from_all().empty_timeout(2s).extract_n(20).stop_on(...), case_(...), case_(...), ...); 

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


рддреЛ CRTP рдХрд╣рд╛рдБ рдЖрддрд╛ рд╣реИ?


рд▓реЗрдЦ рдХреЗ рд╢реАрд░реНрд╖рдХ рдореЗрдВ CRTP рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡рд╣ рдЙрддреНрд╕реБрдХрддрд╛ рд╕реЗ рдЖрд╡рд░реНрддреА рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрдЯрд░реНрди рднреА рд╣реИ (рдЬреЛ рдЗрд╕ рджрд┐рд▓рдЪрд╕реНрдк, рд▓реЗрдХрд┐рди рдереЛрдбрд╝рд╛ рдорд╕реНрддрд┐рд╖реНрдХ-рд╕рд╣рд┐рд╖реНрдгреБ рддрдХрдиреАрдХ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ рд╕реА ++ рдмреНрд▓реЙрдЧ рдкрд░ рдкреЛрд╕реНрдЯ рдХреА рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред


CRTP рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ CRTP рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдордиреЗ рдкреНрд░рд╛рдкреНрдд () рдФрд░ рдЪрдпрди () рдлрд╝рдВрдХреНрд╢рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдерд╛ред рдЪреВрдВрдХрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╢реЗрд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ () рдФрд░ рдЪрдпрди () рдПрдХ рд╣реА рдерд╛, рдХреЛрдб рдиреЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:


 template<typename Derived> class bulk_processing_params_t { ...; //     . Derived & self_reference() { return static_cast<Derived &>(*this); } ... public: auto & handle_n(int v) { to_handle_ = v; return self_reference(); } ... auto & extract_n(int v) { to_extract_ = v; return self_reference(); } ... }; class receive_processing_params_t final : public bulk_processing_params_t<receive_processing_params_t> { ...; //   receive . }; class select_processing_params_t final : public bulk_processing_params_t<select_processing_params_t> { ...; }; 

рдпрд╣рд╛рдБ CRTP рдХреНрдпреЛрдВ рд╣реИ?


рд╣рдореЗрдВ рдпрд╣рд╛рдБ CRTP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛ рддрд╛рдХрд┐ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЧрдИ рд╕реЗрдЯрд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╡реНрдпреБрддреНрдкрдиреНрди рдПрдХ рд╕рдВрджрд░реНрдн рдореЗрдВ рд▓реМрдЯ рд╕рдХреЗрдВред


рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рдпрд╣ рд╕реАрдЖрд░рдЯреАрдкреА рдирд╣реАрдВ рдерд╛ рдЬреЛ рдХрд┐ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╕рд╛рдзрд╛рд░рдг рд╡рд┐рд░рд╛рд╕рдд, рддреЛ рд╣рдо рдХреЗрд╡рд▓ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:


 class bulk_processing_params_t { public: //      bulk_processing_params_t, //     . bulk_processing_params_t & handle_n(int v) {...} bulk_processing_params_t & extract_n(int v) {...} ... }; class receive_processing_params_t final : public bulk_processing_params_t { public: //      //   bulk_processing_params_t,    // receive_processing_params_t. ... //       //  receive_processing_params_t. receive_processing_params_t & receive_payload(int v) {...} }; class select_processing_params_t final : public bulk_processing_params_t { public: //      //   bulk_processing_params_t,    // select_processing_params_t. ... }; 

рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЖрджрд┐рдо рддрдВрддреНрд░ рд╣рдореЗрдВ рдПрдХ рд╣реА рдмрд┐рд▓реНрдбрд░ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐:


 receive_processing_params_t{}.handle_n(20).receive_payload(0) 

рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВред рд╣реИрдВрдбрд▓_ рдПрди () рд╡рд┐рдзрд┐ рдмрд▓реНрдХ_рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ_рдкрд░рдо__ рдХрд╛ рд╕рдВрджрд░реНрдн рд▓реМрдЯрд╛рдПрдЧреА, рдФрд░ рд╡рд╣рд╛рдБ рдкреНрд░рд╛рдкреНрдд_рдкреЗрдпреЛрдб () рд╡рд┐рдзрд┐ рдЕрднреА рддрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред


рд▓реЗрдХрд┐рди CRTP рдХреЗ рд╕рд╛рде рд╣рдореЗрдВ рдмрд┐рд▓реНрдбрд░ рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред


рдЕрдВрддрд┐рдо рдирд┐рд░реНрдгрдп


рдЕрдВрддрд┐рдо рд╕рдорд╛рдзрд╛рди рдЕрдВрддрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╕реНрд╡рдпрдВ рдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╛рдкреНрдд_рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ_рдкрд░рдо__ рдФрд░ рдЪрдпрди_рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ_рдкрд░рдо__ред рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдирд┐рдореНрди рд░реВрдк рдХреЗ рд╕реНрдХреЗрд▓рд░ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдорд╛рдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП:


 enum class msg_count_status_t { undefined, defined }; 

рдФрд░ рддрд╛рдХрд┐ рдЕрдВрддрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреЛ T <msg_count_status_t :: undefined> рд╕реЗ T <msg_count_status_t :: рдкрд░рд┐рднрд╛рд╖рд┐рдд> рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред


рдпрд╣, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╛рдкреНрдд () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ get_processing_params_t рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдХреЙрдореНрдк-рдЯрд╛рдЗрдо рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдорд╛рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

 template< msg_count_status_t Msg_Count_Status, typename... Handlers > inline mchain_receive_result_t receive( const mchain_receive_params_t<Msg_Count_Status> & params, Handlers &&... handlers ) { static_assert( Msg_Count_Status == msg_count_status_t::defined, "message count to be processed/extracted should be defined " "by using handle_all()/handle_n()/extract_n() methods" ); 

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣: рд▓реЗрдирд╛ рдФрд░ рдХрд░рдирд╛;)


рдХрд┐рдП рдЧрдП рдирд┐рд░реНрдгрдп рдХрд╛ рд╡рд┐рд╡рд░рдг


рдЖрдЗрдП рдПрдХ рдиреНрдпреВрдирддрдо рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ, рдЬреЛ рдХрд┐ SObjectizer рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рджрд┐рдЦрддрд╛ рд╣реИред


рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИ рдпрд╛ рдирд╣реАрдВ:


 enum class msg_count_status_t { undefined, defined }; 

рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдПрдХ рдРрд╕реА рд╕рдВрд░рдЪрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рд╕рд╛рдорд╛рдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ:


 struct basic_data_t { int to_extract_{}; int to_handle_{}; int common_payload_{}; }; 

рдЖрдо рддреМрд░ рдкрд░ рдпрд╣ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рдХрд┐ рдмреБрдирд┐рдпрд╛рджреА_рдбреЗрдЯрд╛_рдЯреА рдХреА рд╕рд╛рдордЧреНрд░реА рдХреНрдпрд╛ рд╣реЛрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдКрдкрд░ рджрд┐рдЦрд╛рдП рдЧрдП рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдиреНрдпреВрдирддрдо рд╕реЗрдЯ рдЙрдкрдпреБрдХреНрдд рд╣реИред


Basic_data_t рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХреЗ рд▓рд┐рдП (рдЪрд╛рд╣реЗ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдП), рдЪрдпрди рдХрд░реЗрдВ (), рдпрд╛ рдХреБрдЫ рдФрд░), рдЗрд╕рдХрд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ basic_data_t рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдЕрдореВрд░реНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкреНрд░рд╛рдкреНрдд () рдХреЗ рд▓рд┐рдП, рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рд╣реЛрдЧреА:


 struct receive_specific_data_t final : public basic_data_t { int receive_payload_{}; receive_specific_data_t() = default; receive_specific_data_t(int v) : receive_payload_{v} {} }; 

рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдмреБрдирд┐рдпрд╛рджреА_рдбреЗрдЯрд╛_ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдЗрд╕рдХреЗ рд╡рдВрд╢рдЬ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрдирддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕рдорд╛рдзрд╛рди рдХреЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рднрд╛рдЧреЛрдВ рдХреА рдУрд░ рдмрдврд╝рддреЗ рд╣реИрдВред


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


 template<typename Basic_Data> class basic_data_holder_t { private : Basic_Data data_; protected : void set_to_extract(int v) { data_.to_extract_ = v; } void set_to_handle(int v) { data_.to_handle_ = v; } void set_common_payload(int v) { data_.common_payload_ = v; } const auto & data() const { return data_; } public : basic_data_holder_t() = default; basic_data_holder_t(Basic_Data data) : data_{std::move(data)} {} int to_extract() const { return data_.to_extract_; } int to_handle() const { return data_.to_handle_; } int common_payload() const { return data_.common_payload_; } }; 

рдпрд╣ рд╡рд░реНрдЧ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕рдореЗрдВ basic_data_t рд╕реЗ рдХрд┐рд╕реА рднреА рд╡рдВрд╢рдЬ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╡рд┐рдзрд╛рдпрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ basic_data_t рдореЗрдВ рд╣реИрдВред


рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рд╕рдорд╛рдзрд╛рди рдХреЗ рдФрд░ рднреА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рднрд╛рдЧреЛрдВ рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝реЗрдВ, рдЖрдкрдХреЛ рдмреЗрд╕рд┐рдХ_рдбреЗрдЯрд╛_рд╣реЛрд▓реНрдбрд░ рдЯреАрдЯреА рдореЗрдВ рдбреЗрдЯрд╛ () рдкрджреНрдзрддрд┐ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрд░реАрдХрд╛ рд╣реИ рдФрд░ рд╣рдо рдмрд╛рдж рдореЗрдВ рдЗрд╕рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗред


рдЕрдм рд╣рдо рдХреБрдВрдЬреА рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреНрд▓рд╛рд╕ рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдбрд░рд╛рд╡рдирд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЖрдзреБрдирд┐рдХ C ++ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдирд╣реАрдВ рд╣реИрдВ:


 template<typename Data, typename Derived> class basic_params_t : public basic_data_holder_t<Data> { using base_type = basic_data_holder_t<Data>; public : using actual_type = Derived; using data_type = Data; protected : actual_type & self_reference() { return static_cast<actual_type &>(*this); } decltype(auto) clone_as_defined() { return self_reference().template clone_if_necessary< msg_count_status_t::defined >(); } public : basic_params_t() = default; basic_params_t(data_type data) : base_type{std::move(data)} {} decltype(auto) handle_all() { this->set_to_handle(0); return clone_as_defined(); } decltype(auto) handle_n(int v) { this->set_to_handle(v); return clone_as_defined(); } decltype(auto) extract_n(int v) { this->set_to_extract(v); return clone_as_defined(); } actual_type & common_payload(int v) { this->set_common_payload(v); return self_reference(); } using base_type::common_payload; }; 

рдпрд╣ basic_params_t рдореБрдЦреНрдп CRTP рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣реИред рдХреЗрд╡рд▓ рдЕрдм рдЗрд╕реЗ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕реЗ рдЕрдВрджрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, get_specific_data_t рдпрд╛ select_specific_data_tред


рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ CRTP рдХреЗ рдкрд░рд┐рдЪрд┐рдд рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ self_reference () рдкрджреНрдзрддрд┐ рдореЗрдВ рдПрдХ рд╡реНрдпреБрддреНрдкрдиреНрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


Basic_params_t рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдЗрд╕рдХреА рдХреНрд▓реЛрди_рд╕_рдбрд┐рдлрд╛рдЗрдВрдб () рд╡рд┐рдзрд┐ рд╣реИред рдЗрд╕ рд╡рд┐рдзрд┐ рд╕реЗ рдпрд╣ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╡рд╛рд░рд┐рд╕ clone_if_n рдЬрд░реВрд░реА () рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ред рдФрд░ рдпрд╣ clone_if_n Essential () рдмрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ T <msg_count_status_t :: undefined> рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ T <msg_count_status_t :: рдкрд░рд┐рднрд╛рд╖рд┐рдд> рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╕реЗрдЯрд░ рдореЗрдердбреНрд╕__ (), рд╣реИрдВрдбрд▓_ рдПрди () рдФрд░ рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯ_ рдПрди () рдореЗрдВ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ clone_as_defined (), handle_all (), handle_n () рдФрд░ extract_n () рдЙрдирдХреЗ рд░рд┐рдЯрд░реНрди рдореВрд▓реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд (рдСрдЯреЛ) рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдФрд░ рдЪрд╛рд▓ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдЬрд▓реНрдж рд╣реА рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред


рдЕрдм рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдВрддрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдм рдХрд▓реНрдкрдирд╛ рдХреА рдЧрдИ рдереА:


 template< msg_count_status_t Msg_Count_Status > class receive_specific_params_t final : public basic_params_t< receive_specific_data_t, receive_specific_params_t<Msg_Count_Status> > { using base_type = basic_params_t< receive_specific_data_t, receive_specific_params_t<Msg_Count_Status> >; public : template<msg_count_status_t New_Msg_Count_Status> std::enable_if_t< New_Msg_Count_Status != Msg_Count_Status, receive_specific_params_t<New_Msg_Count_Status> > clone_if_necessary() const { return { this->data() }; } template<msg_count_status_t New_Msg_Count_Status> std::enable_if_t< New_Msg_Count_Status == Msg_Count_Status, receive_specific_params_t& > clone_if_necessary() { return *this; } receive_specific_params_t(int receive_payload) : base_type{ typename base_type::data_type{receive_payload} } {} receive_specific_params_t(typename base_type::data_type data) : base_type{ std::move(data) } {} int receive_payload() const { return this->data().receive_payload_; } }; 

рдкрд╣рд▓реА рдЪреАрдЬрд╝ рдЬрд┐рд╕ рдкрд░ рдЖрдкрдХреЛ рдпрд╣рд╛рдБ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рд╣реИ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░, рдЬреЛ base_type :: data_type рд▓реЗрддрд╛ рд╣реИред рдЗрд╕ рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╡рд░реНрддрдорд╛рди рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рди T <msg_count_status_t :: undefined> рд╕реЗ T <msg_count_status_t :: рдкрд░рд┐рднрд╛рд╖рд┐рдд> рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рджреМрд░рд╛рди рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред


рдХреБрдЫ рдФрд░ рдмрдбрд╝реЗ, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣реИ:


 template<typename V, int K> class holder_t { V v_; public: holder_t() = default; holder_t(V v) : v_{std::move(v)} {} const V & value() const { return v_; } }; holder_t<std::string, 0> v1{"Hello!"}; holder_t<std::string, 1> v2; v2 = v1; //   ,   v1  v2   . v2 = holder_t<std::string, 1>{v1.value()}; //    . 

рдФрд░ рдмрд╕ рдЙрдкрд░реНрдпреБрдХреНрдд рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ get_specific_params_t рдЖрдкрдХреЛ get_specific_params_t <msg_count_status_t :: define> get_specific_params_t <msg_count_status_t :: undefined> рд╕реЗ рдорд╛рдиреЛрдВ рдХреЛ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


Get_specific_params_t рдореЗрдВ рджреВрд╕рд░реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреАрдЬ рджреЛ рдХреНрд▓реЛрди_рдирд┐рдлрд╝реНрд░реА (рдЖрд╡рд╢реНрдпрдХ) рддрд░реАрдХреЗ рд╣реИрдВред


рджреЛ рдХреНрдпреЛрдВ рд╣реИрдВ? рдФрд░ рдпрд╣ рд╕рдм SFINAE-vskaya рдЬрд╛рджреВ рдХрд╛ рдЙрдирдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?


рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдкрд╛рдВрддрд░реЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдХреНрд▓реЛрди_рдирд┐рд╢реНрдЪрд┐рдд (рдЖрд╡рд╢реНрдпрдХ) рддрд░реАрдХреЗ рдмрдирд╛рдП рдЧрдП рд╣реИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рд╣реИрдВрдбрд▓_ рдПрди () рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛__ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ_рдкрд░рд┐рдирд╛рдо_рдЯреА <msg_count_status_t :: рдкрд░рд┐рднрд╛рд╖рд┐рдд>ред рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ extract_n () рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЕрдиреБрдордд рд╣реИ, handle_n () рдФрд░ extract_n () рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рддреЗ рд╣реИрдВред Extract_n () рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рд╣рдореЗрдВ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП__рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА_рдкрд░рдо_t <msg_count_status_t :: рдкрд░рд┐рднрд╛рд╖рд┐рдд>ред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╣реИред рддреЛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдПрдХ рдореМрдЬреВрджрд╛ рдПрдХ рдкреБрди: рдЙрдкрдпреЛрдЧ?


рдЗрд╕реАрд▓рд┐рдП рдпрд╣рд╛рдВ рджреЛ рдХреНрд▓реЛрди_рдирд┐рдлрд╝рд░ (рдЖрд╡рд╢реНрдпрдХ) рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВред рдЬрдм рдкрд░рд┐рд╡рд░реНрддрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдкрд╣рд▓рд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛:


  template<msg_count_status_t New_Msg_Count_Status> std::enable_if_t< New_Msg_Count_Status != Msg_Count_Status, receive_specific_params_t<New_Msg_Count_Status> > clone_if_necessary() const { return { this->data() }; } 

рд╕рдВрдХрд▓рдХ рдЗрд╕рдХрд╛ рдЪрдпрди рдХрд░реЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╕реНрдерд┐рддрд┐ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИред рдФрд░ рдпрд╣ рд╡рд┐рдзрд┐ рдПрдХ рдирдИ рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рдПрдЧреАред рдФрд░ рд╣рд╛рдВ, рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╣рдо рдбреЗрдЯрд╛ () рдХреЙрд▓ рдкрд░ рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА basic_data_holder_t рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


рджреВрд╕рд░реА рд╡рд┐рдзрд┐:


  template<msg_count_status_t New_Msg_Count_Status> std::enable_if_t< New_Msg_Count_Status == Msg_Count_Status, receive_specific_params_t& > clone_if_necessary() { return *this; } 

рддрдм рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рди рд╣реЛред рдФрд░ рдпрд╣ рд╡рд┐рдзрд┐ рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддреА рд╣реИред


рдЕрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпреЛрдВ рдХрдИ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП basic_params_t рдореЗрдВ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЛ рдбрд┐рдХреНрд▓реЗрдкрдЯ (рдСрдЯреЛ) рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЖрдЦрд┐рд░рдХрд╛рд░, рдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИрдВ рдХрд┐ рдХреНрд▓реЛрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХреМрди рд╕рд╛ рд╡рд┐рд╢реЗрд╖ рд╕рдВрд╕реНрдХрд░рдг рдХреНрд▓реЛрди рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдпрд╛ рддреЛ рдПрдХ рд╡рд╕реНрддреБ рдпрд╛ рдПрдХ рд▓рд┐рдВрдХ рд╡рд╣рд╛рдВ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ... рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛рдПрдВрдЧреЗред рдФрд░ рдпрд╣рд╛рдБ рдбрд┐рдХреНрд▓реЗрдкрдЯ (рдСрдЯреЛ) рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИред


рдЫреЛрдЯрд╛ рдЦреБрд▓рд╛рд╕рд╛


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


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, basic_data_holder_t :: data () рд╡рд┐рдзрд┐ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░рдВрддрд░ рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИред рдпрд╣ T <msg_count_status_t :: undefined> рд╕реЗ T <msg_count_status_t :: рдкрд░рд┐рднрд╛рд╖рд┐рдд> рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рджреМрд░рд╛рди рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рдиреЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИред рдпрджрд┐ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдирдХрд▓ рдХрд░рдирд╛ рдПрдХ рдорд╣рдВрдЧрд╛ рдСрдкрд░реЗрд╢рди рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдХрджрдо рд╢рдмреНрджрд╛рд░реНрде рд╕реЗ рд╣реИрд░рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдбреЗрдЯрд╛ () рд╡рд┐рдзрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИ:


 auto data() { return std::move(data_); } 

рдЕрдм рднреА, рд╣рд░ рдЕрдВрддрд┐рдо рдкреНрд░рдХрд╛рд░ рдореЗрдВ (рдЬреИрд╕реЗ get_specific_params_t рдФрд░ select_specific_params_t), рдЖрдкрдХреЛ рдХреНрд▓реЛрди-рд▓рд╛рдЧреВ_ рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╛рдиреА рдЗрд╕ рдЬрдЧрд╣ рдореЗрдВ рд╣рдо рдЕрднреА рднреА рдХреЙрдкреА рдкреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреЛрдб рдХреЗ рджреЛрд╣рд░рд╛рд╡ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХреБрдЫ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


"рд╕рд┐рдВрдЯреИрдХреНрд╕ рдУрд╡рд░рд╣реЗрдб" (рдУрдВ) рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдореЗрдВ рдиреАрдЪреЗ рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╣рд╛рдБ, noexcept рдирд╣реАрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред


рд╡рд╣ рд╕рдм


рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдиреНрдпреВрдирддрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдФрд░ рдЖрдк рдСрди-рд▓рд╛рдЗрди рд╕рдВрдХрд▓рдХ рдореЗрдВ рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ (рдЖрдк рд▓рд╛рдЗрди 163 рдкрд░ рд╣реИрдВрдбрд▓_all () рдкрд░ рдХреЙрд▓ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ)ред


рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВрдиреЗ рдЬреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ рд╡рд╣ рдПрдХрдорд╛рддреНрд░ рд╕рд╣реА рд╣реИред рд▓реЗрдХрд┐рди, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдореЗрдВ рдПрдХ рд╡рд┐рдХрд▓реНрдк рджреЗрдЦрд╛ред рдФрд░, рджреВрд╕рд░реА рдмрд╛рдд, рдРрд╕рд╛ рдХрд░рдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рдерд╛, рдФрд░ рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рдирд╣реАрдВ рд▓рдЧрд╛ред рд▓реЗрдХрд┐рди рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдШреВрдВрд╕реЗ рдиреЗ рддреБрд░рдВрдд рдорджрдж рдХреА, рдХреНрдпреЛрдВрдХрд┐ рдкреБрд░рд╛рдиреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдиреЗ рд╕реЛрдмрд┐рдЬрд╛рдЗрдЬрд╝рд░ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреА рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдЕрдиреБрдХреВрд▓ рдХрд┐рдпрд╛ред


рдЗрд╕рд▓рд┐рдП, рдореЗрд░реЗ рд▓рд┐рдП, рд╕реА ++ рдиреЗ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдкреБрд╖реНрдЯрд┐ рдХреА рд╣реИ рдХрд┐ рдпрд╣ рдЬрдЯрд┐рд▓ рд╣реИред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЕрдзрд┐рдХ рдЕрд╡рд╕рд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдПред рдпрджрд┐ рдореИрдВ рдпрд╣ рд╕рдм рдЖрдзреБрдирд┐рдХ C ++ рд╕реЗ рднреА рдЕрдзрд┐рдХ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛ред


рдкреБрдирд╢реНрдЪред рдпрджрд┐ рдкрд╛рдардХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ SObjectizer рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг 5.6, рдЬрд┐рд╕рдореЗрдВ 5.5 рд╢рд╛рдЦрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХрд╛ рдХрд╛рдлреА рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рд╕рд╛рдВрд╕ рд▓реЗ рд░рд╣рд╛ рдерд╛ред рдЖрдк рдЗрд╕реЗ BitBucket рдкрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд░рд┐рд▓реАрдЬрд╝ рдЕрднреА рднреА рдПрдХ рд▓рдВрдмрд╛ рд░рд╛рд╕реНрддрд╛ рддрдп рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди SObjectizer-5.6 рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ рдЬреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдерд╛ред рдЖрдк рдЕрдкрдиреЗ рдЗрдВрдкреНрд░реЗрд╢рди рдХреЛ рд▓реЗ, рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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


All Articles