рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдореЗрдВ, рдХреБрдЫ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдмрд╣реБрдд рдмрд╛рд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИред C ++ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреНрд▓рд╛рд╕рд┐рдХ рддрд░реАрдХрд╛ рдПрдирдо рдПрдирдо рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреЛ рд╕реНрдХреНрд░реАрди рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк enum рд╕реНрдХреНрд░реАрди {screen_one, screen_two} рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ; рдФрд░ рдЪрд░ рд╕реНрдХреНрд░реАрди cur_screen_ред рд░реЗрдВрдбрд░рд░ рдХреЛ рдореЙрдбрд▓ рд╕реЗ "рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪрдпрдирд┐рдд рд╕реНрдХреНрд░реАрди" рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдбреНрд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рд╕реНрдХреНрд░реАрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдкреВрдЫрд╛ рдЬрд╛ рд╕рдХреЗред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
switch (model.cur_screen())
{
case screen_one:
model.get_screen_one_elements();
...
case screen_two:
model.get_screen_two_elements();
...
}
рдЗрд╕ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреВрд╕рд░реА рд╕реНрдХреНрд░реАрди рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП get_screen_two_elements () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдЬрдм рд╡рд░реНрддрдорд╛рди рд╕реНрдХреНрд░реАрди рдкрд╣рд▓реА рд╣реЛред рд╕реНрдХреНрд░реАрди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ ASSERT рдЕрднрд┐рдХрдердиреЛрдВ (cur_screen_ == screen_one) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рд░рдирдЯрд╛рдЗрдо рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рди :: рд╕рдордпрдмрджреНрдзрддрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рди-рд╕рдордп рдирд┐рдпрдВрддреНрд░рдг рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░рд╛рдЬреНрдп рдкреГрдердХреНрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, screen_one рдФрд░ screen_two рдПрдирдо рддрддреНрд╡ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреВрд░реНрдг рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВред рдФрд░ рдЗрд╕ рд░рд╛рдЬреНрдп рдкрд░ рдирд┐рд░реНрднрд░ рд╕рднреА рдбреЗрдЯрд╛ рдФрд░ рддрд░реАрдХреЗ рд░рд╛рдЬреНрдп рдХреА рд╢реНрд░реЗрдгреА рдореЗрдВ рдЖрддреЗ рд╣реИрдВред
рдореБрдЦреНрдп рдореЙрдбрд▓ рдореЗрдВ рдЕрдм get_screen_one_elements () рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ, рдЕрдм screen_one рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ get_elements () рд╡рд┐рдзрд┐ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪрдпрдирд┐рдд рд╕реНрдХреНрд░реАрди рдХреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдврд╝рд╛рд╡рд╛ рдХреЗ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╣реИ :: рд╕рдВрд╕реНрдХрд░рдг <screen_one, screen_two>ред
class screen_one
{
public :
const std :: vector < screen_one_elements >& get_elements() const
{
return ...;
}
};
class screen_two
{
public :
const std :: vector < screen_two_elements >& get_elements() const
{
return ...;
}
};
class cool_data_model
{
public :
typedef boost :: variant < screen_one, screen_two > screen;
template < typename NewScreenType >
void change_screen( const NewScreenType & new_val)
{
cur_screen_ = new_val;
}
template < typename VisitorType >
VisitorType :: result_type apply_visitor( const VisitorType & visitor)
{
return boost :: apply_visitor(visitor, cur_screen_);
}
private :
screen cur_screen_;
};
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдореЙрдбрд▓ рдХреЛ рджреЗрдЦрдиреЗ (рдЖрдХрд░реНрд╖рд┐рдд) рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЖрдЧрдВрддреБрдХ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлрд╝рдирдХрд╛рд░ рд╣реИ рдЬреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдХреЛрд╖реНрдардХ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдПред
class painter : public boost :: static_visitor <>
{
public :
void operator ()( const screen_one & val_screen)
{
// ,
val_screen.get_elements();
...
}
void operator ()( const screen_two & val_screen)
{
// ,
val_screen.get_elements();
...
}
};
model.apply_visitor(painter());
рд░рд╛рдЬреНрдп рд╡рд░реНрдЧ рдЙрд╕ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдЬрдм рд╕реНрдХреНрд░реАрди "рдЪрдпрдирд┐рдд рд╕реНрдерд┐рддрд┐" рдореЗрдВ рд╣реЛрддреА рд╣реИ рдФрд░ рд╕рднреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдХреЛ рд╡рд░реНрддрдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рджреВрд╕рд░реА рд╕реНрдХреНрд░реАрди рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рднреМрддрд┐рдХреА рдореЗрдВ "рдорд╛рдк" рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЖрдЧрдВрддреБрдХреЛрдВ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИред рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдгрд╛рд▓реА рд╣реИ, рд╣рдо рдЗрд╕реЗ рдорд╛рдкрдиреЗ рд╡рд╛рд▓рд╛ рдпрдВрддреНрд░ рд▓рдЧрд╛рддреЗ рд╣реИрдВред рд╣рдо рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ / рдпрд╛ рд╕рд┐рд╕реНрдЯрдо рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рднрд╛рд╖рд╛ рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рдЖрдЧрдВрддреБрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗ рд╣рдореЗрдВ рдПрдПрд╕рдЯреА (рддрддреНрд╡реЛрдВ рдХрд╛ рдкреЗрдбрд╝) рдорд┐рд▓рддрд╛ рд╣реИ, рдлрд┐рд░ рд╣рдо рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рдЕрдиреБрдХреВрд▓рди рдФрд░ рдкрд░рд┐рдгрд╛рдореА рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред