рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╕реА ++ рдореЗрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЕрдкрдиреЗ рдкреВрд░реНрд╡рдЬреЛрдВ рд╕реА рдореЗрдВ, рдЯрд╛рдЗрдкрдбреАрдПрдл рдирд┐рд░реНрджреЗрд╢ рдирдП рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореМрдЬреВрджрд╛ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдЙрдкрдирд╛рдоред рдФрд░ рдЕрдЧрд░ рдХрдордЬреЛрд░ рдЯрд╛рдЗрдк рд╕реА рдореЗрдВ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереА, рддреЛ рд╕рдЦреНрдд рд╕реА ++ рдореЗрдВ рдпрд╣ рдШрдмрд░рд╛рд╣рдЯ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдорд╛рдпрд╛рд╡реА рдХреАрдбрд╝реЗред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдЗрд╕ рдЕрдкреНрд░рд┐рдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред
рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред
typedef unsigned int galosh_count_t; typedef unsigned int cow_count_t; void print (galosh_count_t count) { std::cout << " " << count << " !" << std::endl; } void print (cow_count_t count) { std::cout << " " << count << " !" << std::endl; } void print (galosh_count_t galosh_count, cow_count_t cow_count) { std::cout << " " << galosh_count << " " << cow_count << " !" << std::endl; } int main (int, char*[]) { galosh_count_t galosh_count = 10; cow_count_t cow_count = 15; print (cow_count, galosh_count);
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпрд╛рдБ рд╣реИрдВ рдФрд░ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рддреНрд░реБрдЯрд┐ рд╣реИред рдФрд░ рдпрджрд┐ рдЖрдк рдПрдХ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдкреНрд░рд┐рдВрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ рдХреЗ рд╕рд╛рде рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рддрд░реНрдХреЛрдВ рдХреЗ рдЧрд▓рдд рдЖрджреЗрд╢ рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╢рд╛рдирджрд╛рд░ рдФрд░ рдорд╛рдпрд╛рд╡реА рдХреАрдбрд╝реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдХреЗ, рдРрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рднреА рдмреЗрд╣рдж рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЕрдзрд┐рдХ рддрд░реНрдХ, рдЙрддрдирд╛ рд╣реА рдХрдард┐рдиред
рд╣рдо рд╕рдВрдХрд▓рдХ рдХреЛ рдЧрд╛рдпреЛрдВ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдЦрд╛рддреЗ рд╣реИрдВ
рддреЛ, рдХреИрд╕реЗ рдПрдХ рдЙрдкрдирд╛рдо рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП typedef рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП? рдмреЗрд╢рдХ, рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреА рдорджрдж рд╕реЗред
рдкреНрд░рдпрд╛рд╕ рдирдВрдмрд░ 1ред
template <class T> class strong_type { public: explicit strong_type (const T& val) : _val (val) {} strong_type& operator = (const T& val) {_val = val; return *this;} private: T _val; }; typedef strong_type<unsigned int> galosh_count_t; typedef strong_type<unsigned int> cow_count_t;
рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, galosh_count_t рдФрд░ cow_count_t рд╕рднреА рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ strong_type рдХреНрд▓рд╛рд╕ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд int рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рддреНрд╡рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХ рдирдпрд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдПрдХ рдФрд░ рддрд░реНрдХ рдЬреЛрдбрд╝реЗрдВрдЧреЗред
рдкреНрд░рдпрд╛рд╕ рдирдВрдмрд░ 2ред
template <class T, class Tag> class strong_type { public: explicit strong_type (const T& val) : _val (val) {} strong_type& operator = (const T& val) {_val = val; return *this;} private: T _val; }; typedef strong_type<unsigned int, class TAG_galosh_count_t> galosh_count_t; typedef strong_type<unsigned int, class TAG_cow_count_t> cow_count_t;
рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ galosh_count_t рдФрд░ cow_count_t рд╣реИрдВред рдЕрдм рд╕рдВрдХрд▓рдХ рдЧрдВрджрд╛ рдореБрдЭ рдкрд░ рдХрд╕рдо рдЦрд╛рддрд╛ рд╣реИ рдЕрдЧрд░ рдореИрдВ рдЕрдЪрд╛рдирдХ рддрд░реНрдХреЛрдВ рдХреЗ рдХреНрд░рдо рдХреЛ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдУрд╡рд░рд▓реЛрдб рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдореЗрдВ TAG_galosh_count_t рдФрд░ TAG_cow_count_t рд╡рд░реНрдЧреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╡реЗ рдХреЗрд╡рд▓ рдЕрджреНрд╡рд┐рддреАрдп рдЯреИрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдВрдд рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ << рдСрдкрд░реЗрдЯрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
template <class T, class Tag> class strong_type { public: explicit strong_type (const T& val) : _val (val) {} strong_type& operator = (const T& val) {_val = val; return *this;} template <class Stream> Stream& operator << (Stream& s) const { s << _val; return s; } private: T _val; }; typedef strong_type<unsigned int, class TAG_galosh_count_t> galosh_count_t; typedef strong_type<unsigned int, class TAG_cow_count_t> cow_count_t;
рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдкрдХреЛ рдЕрдВрдХрдЧрдгрд┐рдд рдФрд░ рддрд╛рд░реНрдХрд┐рдХ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЛ рднреА рдЕрдзрд┐рднрд╛рд░ рджреЗрдирд╛ рд╣реЛрдЧрд╛, рддрд╛рдХрд┐ рдЧрд╛рдпреЛрдВ рдФрд░ рдЧрд╛рд▓реЛрд╢реЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛, рдШрдЯрд╛рдпрд╛ рдФрд░ рддреБрд▓рдирд╛ рдХреА рдЬрд╛ рд╕рдХреЗред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдЦреБрдж рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред