рд╕реА ++ 20 рдорд╛рдирдХ рдЬрд▓реНрдж рд╣реА рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдЬреЛ рдХрд┐
рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд▓реЛрдЧ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рд╣реИрдВ рдФрд░ рд╡реЗ рдХреНрдпрд╛ рдЦрд╛рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЗрд╕ рдЬрд╛рдирд╡рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрд▓рдн рд░реВрд╕реА-рднрд╛рд╖реА рд╕реНрд░реЛрдд рдирд╣реАрдВ рдорд┐рд▓реЗ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдмрддрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЬреЛ рдХрд┐ Arno Sch├╢dl рдХреЗ рдПрдХ рд╡реНрдпрд╛рдЦреНрдпрд╛рди
"Iterators рд╕реЗ рд▓реЗрдХрд░ Ranges: The Upcoming Evolution of the STL" рд╕рдореНрдореЗрд▓рди рдХреА рдмреИрдардХ C ++ 2015 рддрдХ рд╣реИред рд╡рд░реНрд╖ рдХрд╛ред рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдкрд╣рд▓реЗ рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕рд╛рде рд╣реА рдореИрдВ рдЙрди рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд┐рдкреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░рд╛рд▓ рдПрдбреЗрдкреНрдЯрд░ рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ рдФрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рд░реЗрдВрдЬ рдХреЗ рд╕рд╛рде рдкреБрд╕реНрддрдХрд╛рд▓рдп
рдЗрд╕ рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рддреАрди рдореБрдЦреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ рдЬреЛ рдЕрдВрддрд░рд╛рд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:
рдкрд╣рд▓рд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкреВрд░реНрд╡рдЬ рд╣реИ (рдЬреЛ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐
рдмреВрд╕реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА :) рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ)ред рджреВрд╕рд░рд╛ рдПрд░рд┐рдХ рдиреАрдмреНрд▓рд░ рдХрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЕрдВрддрд┐рдо рдкреБрд╕реНрддрдХрд╛рд▓рдп, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдерд┐рдВрдХ-рд╕реЗрд▓ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдХрд┐, рдПрдХ рдХрд╣ рд╕рдХрддрд╛ рд╣реИ, рд╡рд┐рдХрд╕рд┐рдд рдФрд░ рдмреЗрд╣рддрд░ Boost.Rangeред
рдХреНрдпреЛрдВ рдЕрдВрддрд░рд╛рд▓ рд╣рдорд╛рд░реЗ рднрд╡рд┐рд╖реНрдп рд╣реИ?
рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдПрдХ рдЕрдВрддрд░рд╛рд▓ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рд╣рдо рдЗрд╕ рдЧреИрд░-рддреБрдЪреНрдЫ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдЙрд╕ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╢реБрд░реБрдЖрдд рдФрд░ рдПрдХ рдЕрдВрдд (
рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рдПрдХ
рдЬреЛрдбрд╝реА ) рд╣реИред
рдЖрдЗрдП рдЕрдм рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: рдПрдХ рд╡реЗрдХреНрдЯрд░ рд╣реИ, рдЗрд╕рдореЗрдВ рд╕реЗ рд╕рднреА рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡реЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╡рд░реНрддрдорд╛рди рдорд╛рдирдХ рдХреЗ рддрд╣рдд, рд╣рдо рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╣рд▓ рдХрд░реЗрдВрдЧреЗ:
std::vector<T> vec=...; std::sort( vec.begin(), vec.end() ); vec.erase( std::unique( vec.begin(), vec.end() ), vec.end() );
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╡реЗрдХреНрдЯрд░ рдХреЗ рдирд╛рдо рдХреЛ
6 рдмрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ! рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдВрддрд░рд╛рд▓ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП (рд╡реЗрдХреНрдЯрд░ рдХреЛ рдПрдХ рд╡рд╕реНрддреБ рдореЗрдВ рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд рдореЗрдВ рд╕рдВрдпреЛрдЬрди рдХрд░рдирд╛), рд╣рдо рдХреЗрд╡рд▓
рдПрдХ рдмрд╛рд░ рд╡рд╛рдВрдЫрд┐рдд рд╡реЗрдХреНрдЯрд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдХрдИ рдмрд╛рд░ рдЖрд╕рд╛рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
tc::unique_inplace( tc::sort(vec) );
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреМрди рд╕реЗ рдЕрдВрддрд░рд╛рд▓ рд╡рд░реНрддрдорд╛рди рдорд╛рдирдХ рдХреЗ рднреАрддрд░ рд╣реИрдВ?
C ++ 11 рдорд╛рдирдХ рдореЗрдВ, рдХрдВрдЯреЗрдирд░реЛрдВ рдХреА рд╢реБрд░реБрдЖрдд / рдЕрдВрдд рдореЗрдВ рд▓реВрдк рдФрд░ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реНрд░реЗрдгреА-рдЖрдзрд╛рд░рд┐рдд рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдирд╡реАрдирддрдо C ++ 17 рдорд╛рдирдХ рдореЗрдВ, рдЕрдВрддрд░рд╛рд▓ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреБрдЫ рднреА рдирдпрд╛ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред
for ( int& i : <range_expression> ) { ... }
std::begin/end(<range_expression>)
рднрд╡рд┐рд╖реНрдп рдХреЗ рдЕрдВрддрд░рд╛рд▓
рдЖрдЗрдП рдЕрдм рдкрд╣рд▓реЗ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд░реЗрдВрдЬ V3 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдПрд░рд┐рдХ рдирд┐рдмрд▓рд░, рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛, рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдиреЗ рдШрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдиреЗ
рд░реЗрдВрдЬ рдХреА рддрдХрдиреАрдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдмрдирд╛рдИ, рдЕрдВрддрд░рд╛рд▓ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
namespace ranges { template< typename Rng, typename What > decltype(auto) find( Rng && rng, What const& what ) { return std::find( ranges::begin(rng), ranges::end(rng), what ); } }
рдЙрд╕рдХреА рд╕рд╛рдЗрдЯ рдкрд░ рдХреБрдЫ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд╣реИ рдХрд┐ рд╡рд╣ рдХреНрдпрд╛ рдорд╛рдирдХреАрдХрд░рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдпрд╣
рд░реЗрдВрдЬ V3 рд╣реИ ред
рд░реЗрдВрдЬ рдХреЛ рдХреНрдпрд╛ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ,
рдХрдВрдЯреЗрдирд░ (рд╡реЗрдХреНрдЯрд░, рд╕реНрдЯреНрд░рд┐рдВрдЧ, рд╕реВрдЪреА рдЖрджрд┐), рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╢реБрд░реБрдЖрдд рдФрд░ рдПрдХ рдЕрдВрдд рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдЕрдкрдиреЗ рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рдЬрдм рд╣рдо рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрдирдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕реА рддрд░рд╣, рдЬрдм рдПрдХ рдирд┐рд░рдВрддрд░ (рдЧрд╣рд░реА рдирдХрд▓ рдФрд░ рд╕реНрдерд┐рд░рддрд╛) рдХреА рдирдХрд▓ рдФрд░ рдШреЛрд╖рдгрд╛ рдХреА рдЬрд╛рддреА рд╣реИред рджреВрд╕рд░реЗ,
рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдЕрдВрддрд░рд╛рд▓ рднреА рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рджреГрд╢реНрдп рдХреНрд░рдорд╢рдГ рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реБрдП рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рд╣реИред рдпрд╣рд╛рдБ рдЙрдирдХрд╛ рд╕рд░рд▓рддрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:
template<typename It> struct iterator_range { It m_itBegin; It m_itEnd; It begin() const { return m_itBegin; } It end() const { return m_itEnd; } };
рджреГрд╢реНрдп, рдмрджрд▓реЗ рдореЗрдВ, рдХреЗрд╡рд▓ рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдирд╛ рдФрд░ рд╕рдВрдЧрддрд┐ рдЖрд▓рд╕реА рд╣реИ (рдпрд╣ рддрддреНрд╡реЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред
рдЕрдВрддрд░рд╛рд▓ рдПрдбреЗрдкреНрдЯрд░
рдЕрдВрддрд░рд╛рд▓ рдХреЗ рдЖрд╡рд┐рд╖реНрдХрд╛рд░рдХ рдЗрд╕ рдкрд░ рдирд╣реАрдВ рд░реБрдХреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдпрдерд╛ рдпрд╣ рдЕрд╡рдзрд╛рд░рдгрд╛ рдмреЗрдХрд╛рд░ рд╣реЛ рдЬрд╛рддреАред рдЗрд╕рд▓рд┐рдП, рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рд░реЗрдВрдЬ рдПрдбреЗрдкреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ред
рдПрдбреЙрдкреНрдЯрд░ рдПрдбреЙрдкреНрдЯрд░
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: рдПрдХ
рдЗрдВрдЯ рд╡реЗрдХреНрдЯрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдореЗрдВ рд╣рдореЗрдВ 4 рдХреЗ рдмрд░рд╛рдмрд░ рдкрд╣рд▓рд╛ рддрддреНрд╡ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
std::vector<int> v; auto it = ranges::find(v, 4);
рдЕрдм рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ int рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрдЯрд┐рд▓ рд╕реНрд╡-рд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд┐рд╕рдореЗрдВ рдПрдХ int рд╣реИ, рдФрд░ рдХрд╛рд░реНрдп рдЕрднреА рднреА рд╕рдорд╛рди рд╣реИ:
struct A { int id; double data; }; std::vector<A> v={...}; auto it = ranges::find_if( v, [](A const& a) { return a.id == 4; } );
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпреЗ рджреЛрдиреЛрдВ рдХреЛрдб рд╢рдмреНрджрд╛рд░реНрде рдореЗрдВ рд╕рдорд╛рди рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡реЗ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдореЗрдВ рдХрд╛рдлреА рднрд┐рдиреНрди рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдмрд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ
рдЗрдВрдЯ рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдПрдХ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдПрдбреЙрдкреНрдЯрд░ (
рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдПрдбреЙрдкреНрдЯрд░ ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд░рд╕реАрд▓рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
struct A { int id; double data; }; std::vector<A> v={...}; auto it = ranges::find( tc::transform(v, std::mem_fn(&A::id)), 4);
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдорд┐рдВрдЧ рдПрдбреЗрдкреНрдЯрд░, рдЗрдВрдЯ рдлреАрд▓реНрдб рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рд░реИрдкрд░ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдХрд░ рд╣рдорд╛рд░реА рд╕рдВрд░рдЪрдирд╛ рдХреЛ "рд░реВрдкрд╛рдВрддрд░рд┐рдд" рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╕реВрдЪрдХ
рдЖрдИрдбреА рдлрд╝реАрд▓реНрдб рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдЪрд╛рд╣рддреЗ рдереЗ рдХрд┐ рдпрд╣ рдкреВрд░реА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗ, рддреЛ рд╣рдореЗрдВ
tobase () рдХреЗ рдЕрдВрдд рдореЗрдВ
рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ ред рдпрд╣ рдХрдорд╛рдВрдб рдлрд╝реАрд▓реНрдб рдХреЛ рдПрдирдХреИрдк рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рд╡рдЬрд╣ рд╕реЗ рдкреЙрдЗрдВрдЯрд░ рдкреВрд░реЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд╕реЗ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ:
auto it = ranges::find( tc::transform(v, std::mem_fn(&A::id)), 4).base();
рдпрд╣рд╛рдВ рдПрдХ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдПрдбреЙрдкреНрдЯрд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ (рдЗрд╕рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдЕрдкрдирд╛ рдлрд╝рдирдХрд╛рд░ рд╣реИ):
template<typename Base, typename Func> struct transform_range { struct iterator { private: Func m_func;
рдлрд╝рд┐рд▓реНрдЯрд░ рдПрдбрд╛рдкреНрдЯрд░
рдФрд░ рдЕрдЧрд░ рдЕрдВрддрд┐рдо рдХрд╛рд░реНрдп рдореЗрдВ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдРрд╕реЗ рддрддреНрд╡ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕реЗ рддрддреНрд╡реЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП
int рдХреЗ
рдкреВрд░реЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ "рдлрд╝рд┐рд▓реНрдЯрд░" рдХрд░реЗрдВ? рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рдПрдХ рдлрд╝рд┐рд▓реНрдЯрд░ рдПрдбреЗрдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
tc::filter( v, [](A const& a) { return 4 == a.id; } );
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рджреМрд░рд╛рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдФрд░ рдпрд╣рд╛рдБ рдЙрд╕рдХрд╛ рднреЛрд▓реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ (рдХреБрдЫ рдРрд╕рд╛ рд╣реА Boost.Range рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ):
template<typename Base, typename Func> struct filter_range { struct iterator { private: Func m_func;
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдХреЗ рдмрдЬрд╛рдп рджреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдПрдбрд╛рдкреНрдЯрд░ рдореЗрдВ рдерд╛ред рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рджреМрд░рд╛рди рдХрдВрдЯреЗрдирд░ рдХреА рд╕реАрдорд╛рдУрдВ рд╕реЗ рдЖрдЧреЗ рдирд╣реАрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдХреБрдЫ рдЕрдиреБрдХреВрд▓рди
рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ itter
tc рд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИ
:: рдлрд╝рд┐рд▓реНрдЯрд░ (tc :: filter (tc :: filter) (...)) ?
Boost.Range
рдЙрдкрд░реЛрдХреНрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
рджрд┐рд▓ рдХреА рдзрдбрдХрди рдирд╣реАрдВ рджреЗрдЦрддреА!m_func3
m_it3
m_func2
m_it2
m_func1
m_it1;
m_itEnd1;
m_itEnd2
m_func1
m_it1;
m_itEnd1;
m_itEnd3
m_func2
m_it2
m_func1
m_it1;
m_itEnd1;
m_itEnd2
m_func1
m_it1;
m_itEnd1;
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣
рдмрд╣реБрдд рдЕрдХреНрд╖рдо рд╣реИред
рд░реЗрдВрдЬ v3
рдЖрдЗрдП рдЗрд╕ рдПрдбреЗрдкреНрдЯрд░ рдХреЛ рдХреИрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВред рдПрд░рд┐рдХ рдирд┐рдмрд▓рд░ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдПрдбреЙрдкреНрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА (рдЕрдВрдд рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрдЯрд░ рдФрд░ рдПрдХ рдкреЙрдЗрдВрдЯрд░) рдбрд╛рд▓рдирд╛ рдерд╛, рдФрд░ рдлрд┐рд░ рд╣рдо рдЗрд╕ рдПрдбреЗрдкреНрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рдЗрдЯрд┐рдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
*m_rng
m_it
рдлрд┐рд░, рдРрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ, рдЯреНрд░рд┐рдкрд▓ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
TYKm_rng3
m_it3
m_rng2
m_it2
m_rng1
m_it1
рдпрд╣ рдЕрднреА рднреА рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкрд┐рдЫрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдИ рдЧреБрдирд╛ рддреЗрдЬ рд╣реИред
рдерд┐рдВрдХ-рд╕реЗрд▓, рдЗрдВрдбреЗрдХреНрд╕ рдХреЙрдиреНрд╕реЗрдкреНрдЯ
рдЕрдм рдерд┐рдВрдХ-рд╕реЗрд▓ рд╕рдорд╛рдзрд╛рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдерд╛рдХрдерд┐рдд
рд╕реВрдЪрдХрд╛рдВрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рдкреЗрд╢ рдХреАред рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдПрдХ рдРрд╕рд╛ рдЗрдЯрд░реЗрдЯрд░ рд╣реИ, рдЬреЛ рдПрдХ рд░реЗрдЧреБрд▓рд░ рдЗрдЯрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рднреА рдПрдХ рд╣реА рдСрдкрд░реЗрд╢рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рд╡рд▓ рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрдХрд░ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИред
template<typename Base, typename Func> struct index_range { ... using Index = ...; Index begin_index() const; Index end_index() const; void increment_index( Index& idx ) const; void decrement_index( Index& idx ) const; reference dereference( Index& idx ) const; ... };
рд╣рдо рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдирд┐рдпрдорд┐рдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдХреИрд╕реЗ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдПрдХ рдирд┐рдпрдорд┐рдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рднреА рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ, рд╕рдВрдЧрддрддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
template<typename IndexRng> struct iterator_for_index { IndexRng* m_rng; typename IndexRng::Index m_idx; iterator& operator++() { m_rng.increment_index(m_idx); return *this; } ... };
рдлрд┐рд░ рдЯреНрд░рд┐рдкрд▓ рдлрд┐рд▓реНрдЯрд░ рдХреЛ рд╕реБрдкрд░-рдХреБрд╢рд▓рддрд╛ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
template<typename Base, typename Func> struct filter_range { Func m_func; Base& m_base; using Index = typename Base::Index; void increment_index( Index& idx ) const { do { m_base.increment_index(idx); } while ( idx != m_base.end_index() && !m_func(m_base.dereference_index(idx)) ); } };
template<typename IndexRng> struct iterator_for_index { IndexRng* m_rng; typename IndexRng::Index m_idx; ... };
рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ, рдлрд┐рд▓реНрдЯрд░ рдХреА рдЧрд╣рд░рд╛рдИ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЬрд▓реНрджреА рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдЕрдВрддрд░рд╛рд▓ рдФрд░ рдЕрдВрддрд░рд╛рд▓ рдХрдВрдЯреЗрдирд░ рдХреЗ рд╕рд╛рде рдЕрдВрддрд░рд╛рд▓
рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдВрддрд░рд╛рд▓ рдЕрдВрддрд░рд╛рд▓ рдФрд░ рд░реЗрд▓реНрд╡реЗ рдХрдВрдЯреЗрдирд░ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
lvalue
рд░реЗрдВрдЬ V3 рдФрд░ рдерд┐рдВрдХ-рд╕реЗрд▓ рд▓реИрд╡рд▓реНрдпреВ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХреЛрдб рд╣реИ:
auto rng = view::filter(vec, pred1); bool b = ranges::any_of(rng, pred2);
рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рдШреЛрд╖рд┐рдд рд╡реЗрдХреНрдЯрд░ рд╣реИ рдЬреЛ рдореЗрдореЛрд░реА (рдЕрдВрддрд░рд╛рд▓) рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдПрдХ рдЕрдВрддрд░рд╛рд▓ рдмрдирд╛рдиреЗ рдФрд░ рдлрд┐рд░ рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо
рджреГрд╢реНрдп :: рдлрд╝рд┐рд▓реНрдЯрд░ рдпрд╛
рдЯреАрд╕реА :: рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рджреГрд╢реНрдп рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЦреБрд╢ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕ рджреГрд╢реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, any_of рдореЗрдВред
рд░реЗрдВрдЬ V3 рдФрд░ rvalue
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рд╣рдорд╛рд░рд╛ рд╡реЗрдХреНрдЯрд░ рдЕрднреА рддрдХ рдореЗрдореЛрд░реА рдореЗрдВ рдирд╣реАрдВ рдерд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдмрдирд╛ рд░рд╣реЗ рдереЗ), рдФрд░ рд╣рдордиреЗ рдПрдХ рд╣реА рдХрд╛рд░реНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛, рддреЛ рд╣рдо рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд░реЗрдВрдЧреЗ:
auto rng = view::filter(create_vector(), pred1);
рдХреНрдпреЛрдВ рдЙрддреНрдкрдиреНрди рд╣реБрдИ? рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╣рдо рдПрдХ рд╡реЗрдХреНрдЯрд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕реАрдзреЗ рдЗрд╕реЗ рдПрдХ рдлрд╝рд┐рд▓реНрдЯрд░ рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдпрд╛рдирд┐ рдлрд╝рд┐рд▓реНрдЯрд░ рдореЗрдВ рдПрдХ рд▓рд┐рдВрдХ рд▓рд┐рдВрдХ рд╣реЛрдЧрд╛, рдЬреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдореЗрдВ рдПрдХ rvalue рд▓рд┐рдВрдХ рд╣реЛрдЧрд╛, рдЬреЛ рддрдм рдХрд┐рд╕реА рдЕрдЬреНрдЮрд╛рдд рдЪреАрдЬрд╝ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ рдЬрдм рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрдЧрд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд░реЗрдВрдЬ V3
рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд╕рд╛рде рдЖрдпрд╛:
auto rng = action::filter(create_vector(), pred1);
рдХрд╛рд░реНрд░рд╡рд╛рдИ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рд╕рдм рдХреБрдЫ рдХрд░рддреА рд╣реИ, рдЕрд░реНрдерд╛рдд, рдпрд╣ рдмрд╕ рдПрдХ рд╡реЗрдХреНрдЯрд░ рд▓реЗрддрд╛ рд╣реИ, рд╡рд┐рдзреЗрдп рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдорд╛рдЗрдирд╕ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдм рдЖрд▓рд╕реА рдирд╣реАрдВ рд╣реИ, рдФрд░ рдерд┐рдВрдХ-рд╕реЗрд▓ рдиреЗ рдЗрд╕ рдорд╛рдЗрдирд╕ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред
рдерд┐рдВрдХ-рд╕реЗрд▓ рдФрд░ рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡рд┐рддрд╛
рдерд┐рдВрдХ-рд╕реЗрд▓ рдиреЗ рдЗрд╕реЗ рдмрдирд╛рдпрд╛ рддрд╛рдХрд┐ рджреЗрдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдХрдВрдЯреЗрдирд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдП:
auto rng = tc::filter(creates_vector(), pred1); bool b = ranges::any_of(rng, pred2);
рдирддреАрдЬрддрди, рд╣рдо рдПрдХ рд╕рдорд╛рди рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рд┐рдВрдХ рдХреЗ рдмрдЬрд╛рдп rvalue рдХрдВрдЯреЗрдирд░ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЖрд▓рд╕реА рд╣реЛрддрд╛ рд╣реИред рд░реЗрдВрдЬ V3 рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдбрд░ рдерд╛ рдХрд┐ рдлрд┐рд▓реНрдЯрд░ рдХреЗ рдХрд╛рд░рдг рдпрд╛ рддреЛ рдПрдХ рджреГрд╢реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ рдХрдВрдЯреЗрдирд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрдВрдЧреА, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдерд┐рдВрдХ-рд╕реЗрд▓ рдЖрд╢реНрд╡рд╕реНрдд рд╣реИрдВ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ "рдЖрд▓рд╕реНрдп" рдХреЗ рдХрд╛рд░рдг рдЕрдзрд┐рдХрд╛рдВрд╢ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдареАрдХ рд╣реЛрддреА рд╣реИрдВред
рдЬреЗрдирд░реЗрдЯрд░ рдЕрдВрддрд░рд╛рд▓
рд╣рдо рдЕрдВрддрд░рд╛рд▓ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЕрдВрддрд░рд╛рд▓ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ
рдЬрдирд░реЗрдЯрд░ рд░реЗрдВрдЬ рдХрд╣рд╛ рдЬрд╛рддрд╛
рд╣реИ ред рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ GUI рд╡рд┐рдЬреЗрдЯ (рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡) рд╣реИ рдФрд░ рд╣рдо рдПрдХ рдЪрд╛рд▓ рд╡рд┐рдЬреЗрдЯ рдХрд╣рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рдВрдбреЛ рд╣реИ рдЬреЛ рдЕрдкрдиреЗ рд╡рд┐рдЬреЗрдЯ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреА рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕
рд╕реВрдЪреА рдмреЙрдХреНрд╕ рдореЗрдВ рдПрдХ рдмрдЯрди рднреА рд╣реИ, рдФрд░ рдПрдХ рдЕрдиреНрдп рд╡рд┐рдВрдбреЛ рдХреЛ рднреА рдЕрдкрдиреЗ рд╡рд┐рдЬреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рдд, рд╣рдо
traverse_widgets рдХрд╣рддреЗ
рд╣реИрдВ , рдЬреЛ рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рдлрд╝рдирдХрд╛рд░ рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИ (
рдЖрдк рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдПрдиреНрдпреВрдорд░реЗрд╢рди рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдлрд╝рдирдХрд╛рд░ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдЙрди рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдлрд╝рдирдХрд╛рд░ рдореЗрдВ рд╣реИрдВ )ред
template<typename Func> void traverse_widgets( Func func ) { if (window1) { window1->traverse_widgets(std::ref(func)); } func(button1); func(listbox1); if (window2) { window2->traverse_widgets(std::ref(func)); } }
рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ рд╡рд┐рдЬреЗрдЯ рд╕реНрдкреЗрд╕рд┐рдВрдЧ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдХреЛрдИ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдирд╣реАрдВ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рд╕реАрдзреЗ рд▓рд┐рдЦрдирд╛ рдЕрдХреНрд╖рдо рдФрд░ рд╕рдм рд╕реЗ рдКрдкрд░, рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕реА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рднреА рдЕрдВрддрд░рд╛рд▓ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдЕрдВрддрд░рд╛рд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐
any_of :
mouse_hit_any_widget=tc::any_of( [] (auto func) { traverse_widgets(func); }, [] (auto const& widget) { return widget.mouse_hit(); } );
рдерд┐рдВрдХ-рд╕реЗрд▓ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛ:
namespace tc { template< typename Rng > bool any_of( Rng const& rng ) { bool bResult = false; tc::enumerate( rng, [&](bool_context b) { bResult = bResult || b; } ); return bResult; } }
Tc :: enumerate рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЕрдВрддрд░рд╛рд▓ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЖрдВрддрд░рд┐рдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ (рд╡реНрдпрд╛рдЦреНрдпрд╛рди рдореЗрдВ
рдмрд╛рд╣рд░реА рдФрд░
рдЖрдВрддрд░рд┐рдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ), рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕рдХреА рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН
std :: any_of рдЬреИрд╕реЗ рд╣реА
рд╕рдЪ рд╣реЛрддрд╛ рд╣реИ, рд░реБрдХ рдЬрд╛рддрд╛ рд╣реИред рд╡реЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдкрд╡рд╛рдж (рддрдерд╛рдХрдерд┐рдд
рдмрд╛рдзрд┐рдд рдЬрдирд░реЗрдЯрд░ рдЕрдВрддрд░рд╛рд▓ ) рдХреЛ рдЬреЛрдбрд╝рдХрд░ред
рдирд┐рд╖реНрдХрд░реНрд╖
рдореИрдВ рд▓реВрдк рдХреЗ рд▓рд┐рдП рд░реЗрдВрдЬ-рдЖрдзрд╛рд░рд┐рдд рд╕реЗ рдирдлрд░рдд рдХрд░рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИ рдФрд░ рдЬрд╣рд╛рдВ рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЗрд╕ рдХрд╛рд░рдг рдХреЛрдб рдХреА рд╕рдВрдЧрддрд┐ рдЕрдХреНрд╕рд░ рдЦрд░рд╛рдм рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЛрдЧ рдЗрд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
bool b = false; for (int n : rng) { if ( is_prime(n) ) { b = true; break; } }
рдмрдЬрд╛рдп:
bool b = tc::any_of( rng, is_prime );