C ++ рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдмрд╣реБрдд рдмрд╛рд░ рдЖрдк рдЗрд╕ рддрдереНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд░реИрдо рдФрд░ рд░реЛрдо рджреЛрдиреЛрдВ рдХреЛ рдЕрд╡рд╛рдВрдЫрдиреАрдп рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд╕рд╛рдзрди рд▓рд╛рдЧрдд рд╣реЛ рд╕рдХрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЕрдХреНрд╕рд░ 
std рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдХрдХреНрд╖рд╛рдПрдВ рдФрд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИрдВред рдбрд╛рдпрдирд╛рдорд┐рдХ рд░реВрдк рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реА, рдЖрд░рдЯреАрдЯреАрдЖрдИ, рдЕрдкрд╡рд╛рджреЛрдВ, рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рднреА рдХреБрдЫ рдкреНрд░рддрд┐рдмрдВрдз рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреЙрдореНрдкреИрдХреНрдЯ рдФрд░ рдлрд╛рд╕реНрдЯ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕рд┐рд░реНрдл 
std рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдирд╣реАрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ 
typeid рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, 
typeid рдСрдкрд░реЗрдЯрд░ рдХрд╣ 
typeid , рдХреНрдпреЛрдВрдХрд┐ 
typeid рд╕рдорд░реНрдерди рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдУрд╡рд░рд╣реЗрдб рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдЗрди рд╕рднреА рд╢рд░реНрддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд┐рдпрд╛ рдХреЛ рд╕реБрджреГрдврд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕реЗ рдХреБрдЫ рдХрд╛рд░реНрдп рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд╣реИрдВред рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ, рдореИрдВ рдПрдХ рд╕рд░рд▓ рдХрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ - рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдореЗрдВ рдореМрдЬреВрджрд╛ рдЙрдк рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд░рд┐рдЯрд░реНрди рдХреЛрдб рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдХрд╛рд░реНрдп
рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ CPU рдбрд╛рдпрдЧреНрдиреЛрд╕реНрдЯрд┐рдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдЕрдирдЧрд┐рдирдд рд░рд┐рдЯрд░реНрди рдХреЛрдб рд╣реИрдВ, рдпреЗ рдХрд╣реЗрдВ:
 enum class Cpu_Error { Ok, Alu, Rom, Ram } ; 
рдпрджрд┐ CPU рдбрд╛рдпрдЧреНрдиреЛрд╕реНрдЯрд┐рдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо CPU рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреА рд╡рд┐рдлрд▓рддрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ, (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ALU рдпрд╛ RAM), рддреЛ рдЙрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдб рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдПрдХ рдФрд░ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдмрд╛рдд рд╣реИ, рдпрд╣ рдПрдХ рдорд╛рдк рдирд┐рджрд╛рди рд╣реЛрдиреЗ рджреЗрдВ, рдпрд╣ рдЬрд╛рдБрдЪ рдХрд░ рдХрд┐ рдорд╛рдкрд┐рдд рдореВрд▓реНрдп рд╕реАрдорд╛ рдореЗрдВ рд╣реИ рдФрд░ рдпрд╣ рдЖрдо рддреМрд░ рдкрд░ рдорд╛рдиреНрдп рд╣реИ (NAN рдпрд╛ Infinity рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ):
 enum class Measure_Error { OutOfLimits, Ok, BadCode } ; 
рдкреНрд░рддреНрдпреЗрдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП, рдПрдХ 
GetLastError() рд╡рд┐рдзрд┐ рджреЗрдВ рдЬреЛ рдЗрд╕ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЗ рдПрдиреНрдпреВрдорд░реЗрдЯреЗрдб рдПрд░рд░ рдЯрд╛рдЗрдк рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред 
CpuDiagnostic рдкреНрд░рдХрд╛рд░ 
CpuDiagnostic рдХрд╛ 
CpuDiagnostic рдХреЛрдб 
CpuDiagnostic рдЬрд╛рдПрдЧрд╛, рдХреЗ рд▓рд┐рдП 
MeasureDiagnostic рд▓рд┐рдП 
MeasureDiagnostic рдХреЛрдб рд╣реИред
рдФрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд▓реЙрдЧ рд╣реИ, рдЬреЛ рдЬрдм рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХреЛ рд▓реЙрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕реЗ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦреВрдВрдЧрд╛:
 void Logger::Update() { Log(static_cast<uint32_t>(cpuDiagnostic.GetLastError()) ; Log(static_cast<uint32_t>(measureDiagstic.GetLastError()) ; } 
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдПрдиреНрдпреВрдорд░реЗрдЯреЗрдб рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдХреИрд╕реЗ рднреЗрдж рдХрд░реЗрдВ рдХрд┐ рдкрд╣рд▓реА рддреНрд░реБрдЯрд┐ рдХреЛрдб Cpu рдбрд╛рдпрдЧреНрдиреЛрд╕реНрдЯрд┐рдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХрд╛ рддреНрд░реБрдЯрд┐ рдХреЛрдб рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдорд╛рдк рд╕рдмрд╕рд┐рд╕реНрдЯрдо?
рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬреЗ
GetLastError() рдореЗрдердб рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЛрдб рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрдЧрд╛ред рдорд╛рдереЗ рдореЗрдВ рд╕рдмрд╕реЗ рдкреНрд░рддреНрдпрдХреНрд╖ рдирд┐рд░реНрдгрдпреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рд╡рд┐рднрд┐рдиреНрди рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдХреБрдЫ рдЗрд╕ рддрд░рд╣
 constexpr tU32 CPU_ERROR_ALU = 0x10000001 ; constexpr tU32 CPU_ERROR_ROM = 0x10000002 ; ... constexpr tU32 MEAS_ERROR_OUTOF = 0x01000001 ; constexpr tU32 MEAS_ERROR_BAD = 0x01000002 ; ... enum class Cpu_Error { Ok, Alu = CPU_ERROR_ALU, Rom = CPU_ERROR_ROM, Ram = CPU_ERROR_RAM } ; ... 
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдиреБрдХрд╕рд╛рди рд╕реНрдкрд╖реНрдЯ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдмрд╣реБрдд рд╕рд╛рд░реЗ рдореИрдиреБрдЕрд▓ рдХрд╛рдо, рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд░реЗрдВрдЬ рдФрд░ рд░рд┐рдЯрд░реНрди рдХреЛрдб рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдорд╛рдирд╡реАрдп рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдиреЗрдЧрд╛ред рджреВрд╕рд░реЗ, рдХрдИ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдПрдиреНрдпреВрдорд░реЗрд╢рди рдЬреЛрдбрд╝рдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдПрдХ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдпрд╣ рд╕рдВрднрд╡ рди рд╣реЛ рдХрд┐ рддрдмрд╛рджрд▓реЛрдВ рдХреЛ рд╕реНрдкрд░реНрд╢ рди рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛:
 ResultCode result = Cpu_Error::Ok ;  
рдпрд╛ рддреЛ:
 ReturnCode result ; for(auto it: diagnostics) {  
рдпрд╛ рддреЛ:
 void CpuDiagnostic::SomeFunction(ReturnCode errocode) { Cpu_Error status = errorcode ; switch (status) { case CpuError::Alu:  
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреБрдЫ рдХреНрд▓рд╛рд╕ 
ReturnCode рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЛрдб рдФрд░ рдЙрд╕рдХреА рд╢реНрд░реЗрдгреА рджреЛрдиреЛрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╡рд░реНрдЧ 
std::error_code , рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдЧрднрдЧ рдпрд╣ рд╕рдм рдХрд░рддрд╛ рд╣реИред рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЗрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдпрд╣рд╛рдБ рд╡рд░реНрдгрд┐рдд рд╣реИ:
рдЖрдкрдХрд╛ рдЕрдкрдирд╛ std :: code_errorC ++ рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдердирднрд╡рд┐рд╖реНрдп рдХреЗ "C ++" рдореЗрдВ рдирд┐рдпрддрд╛рддреНрдордХ рдЕрдкрд╡рд╛рдж рдФрд░ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗрдореБрдЦреНрдп рд╢рд┐рдХрд╛рдпрдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ 
std::error_category рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдЫреЛрдЯреЗ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдкрд░ рдлрд░реНрдорд╡реЗрдпрд░ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рднрд╛рд░реА рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрдо рд╕реЗ рдХрдо рдПрд╕рдЯреАрдбреА :: рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
 class CpuErrorCategory: public std::error_category { public: virtual const char * name() const; virtual std::string message(int ev) const; }; 
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдЧрдгрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╢реНрд░реЗрдгреА (рдирд╛рдо рдФрд░ рд╕рдВрджреЗрд╢) рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдпрд╣ рднреА рдХреЛрдб 
std::error_code рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред 0. рдФрд░ рдРрд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрдм рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рдХреЛрдб рдЕрд▓рдЧ рд╣реЛрдЧрд╛ред
рдореИрдВ рд╢реНрд░реЗрдгреА рд╕рдВрдЦреНрдпрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рдЙрдкрд░рд┐ рдирд╣реАрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рдЗрд╕рд▓рд┐рдП, рдРрд╕рд╛ рдХреБрдЫ "рдЖрд╡рд┐рд╖реНрдХрд╛рд░" рдХрд░рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрдЧрд╛ рдЬреЛ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЕрдкрдиреЗ рдкреНрд░рдЧрдгрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реНрд░реЗрдгреА рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдиреНрдпреВрдирддрдо рдЖрдВрджреЛрд▓рдиреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ 
std::error_code рд╕рдорд╛рди рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ 
std::error_code , рдХрд┐рд╕реА рднреА рдПрдиреНрдпреВрдорд░реЗрдЯреЗрдб рдЯрд╛рдЗрдк рдХреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдореЗрдВ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдФрд░ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд╕реЗ рдПрдиреНрдпреВрдорд░реЗрдЯреЗрдб рдЯрд╛рдЗрдк рдХреЗ рд╡рд┐рдкрд░реАрддред рдЗрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╢реНрд░реЗрдгреА рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп, рд╕рд╛рде рд╣реА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
 
рдирд┐рд░реНрдгрдп
рдХрдХреНрд╖рд╛ рдХреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛрдб, рдПрдХ рд╢реНрд░реЗрдгреА рдХреЛрдб рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдиреБрд░реВрдк рдПрдХ рдХреЛрдб, рдПрдХ рд╕рдВрдЪрд╛рд▓рдХ рдФрд░ рдПрдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдирд┐рдореНрди рд╡рд░реНрдЧ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:

рдХрдХреНрд╖рд╛ рдХреЛрдб class ReturnCode { public: ReturnCode() { } template<class T> explicit ReturnCode(const T initReturnCode): errorValue(static_cast<tU32>(initReturnCode)), errorCategory(GetCategory(initReturnCode)), goodCode(GetOk(initReturnCode)) { static_assert(std::is_enum<T>::value, "   ") ; } template<class T> operator T() const {  
 рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
  template<class T> explicit ReturnCode(const T initReturnCode): errorValue(static_cast<tU32>(initReturnCode)), errorCategory(GetCategory(initReturnCode)), goodCode(GetOk(initReturnCode)) { static_assert(std::is_enum<T>::value, "   ") ; } 
рдпрд╣ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
 ReturnCode result(Cpu_Error::Ok) ; ReturnCode result1(My_Error::Error1); ReturnCode result2(cpuDiagnostic.GetLatestError()) ; 
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗрд╡рд▓ рдПрдХ рдПрдиреНрдпреВрдорд░реЗрдЯреЗрдб рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, 
static_assert рдХреЛ рдЙрд╕рдХреЗ рд╢рд░реАрд░ 
static_assert рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрдХрд▓рд┐рдд рд╕рдордп рдкрд░ 
std::is_enum рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рджрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдЧрд╛ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдкрд╛рда рдХреЗ рд╕рд╛рде 
std::is_enum рддреНрд░реБрдЯрд┐ 
std::is_enum ред рдЕрд╕рд▓реА рдХреЛрдб рдпрд╣рд╛рдВ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рд╕рдм рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рд╣реИред рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдПрдХ рдЦрд╛рд▓реА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИред
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рднреА рдирд┐рдЬреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдЗрд╕ рдкрд░ рдмрд╛рдж рдореЗрдВ рдЖрдКрдБрдЧрд╛ ...
рдЕрдЧрд▓рд╛, рдХрд╛рд╕реНрдЯ рдСрдкрд░реЗрдЯрд░:
 template<class T> operator T() const {  
рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдПрдиреНрдпреВрдорд░реЗрдЯреЗрдб рдкреНрд░рдХрд╛рд░ рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
  ReturnCode returnCode(Cpu_Error::Rom) ; Cpu_Error status = errorCode ; returnCode = My_Errror::Error2; My_Errror status1 = returnCode ; returnCode = myDiagnostic.GetLastError() ; MyDiagsonticError status2 = returnCode ; 
рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдФрд░ рдЕрд▓рдЧ рд╕реЗ рдмреВрд▓ () рдСрдкрд░реЗрдЯрд░:
  operator bool() const { return (GetValue() != goodCode); } 
рдпрд╣ рд╣рдореЗрдВ рд╕реАрдзреЗ рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд░рд┐рдЯрд░реНрди рдХреЛрдб рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реИ:
 
рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╕рднреА рд╣реИред рдкреНрд░рд╢реНрди 
GetCategory() рдФрд░ 
GetOkCode() рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рд░рд╣рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдХреЛ рдПрдиреНрдпреВрдореЗрд░реЗрдЯреЗрдб рдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЕрдкрдиреА рд╢реНрд░реЗрдгреА рдХреЛ 
ReturnCode рдХреНрд▓рд╛рд╕ рдореЗрдВ 
ReturnCode рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 
ReturnCode , рдФрд░ рджреВрд╕рд░реЗ рдХреЛ рдПрдиреНрдпреВрдореЗрд░реЗрдЯреЗрдб рдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд░рд┐рдЯрд░реНрди рдХреЛрдб рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо 
bool() рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпреЗ рдлрд╝рдВрдХреНрд╢рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рддрд░реНрдХ-рдирд┐рд░реНрднрд░ рдЦреЛрдЬ рддрдВрддреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
 enum class CategoryError { Nv = 100, Cpu = 200 }; enum class Cpu_Error { Ok, Alu, Rom } ; inline tU32 GetCategory(Cpu_Error errorNum) { return static_cast<tU32>(CategoryError::Cpu); } inline tU32 GetOkCode(Cpu_Error) { return static_cast<tU32>(Cpu_Error::Ok); } 
рдЗрд╕рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдПрдиреНрдпреВрдорд░реЗрдЯреЗрдб рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЗрди рджреЛ рддрд░реАрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реНрд░реЗрдгреАрдмрджреНрдз рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рд╢реНрд░реЗрдгреАрд╡рд╛рд░ рдЧрдгрдирд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдорд╛рд░реА рдЗрдЪреНрдЫрд╛ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдореЗрдВ рд▓рдЧрднрдЧ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рд╣реИ рдФрд░ рдЗрд╕ рдмрд╛рдд рдХреА рдЬрд╣рдордд рдирд╣реАрдВ рдЙрдард╛рддреА рд╣реИ рдХрд┐ рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЕрдкрдиреЗ рд╡рд┐рд╕реНрддреГрдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╢реНрд░реЗрдгреА рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдерд╛, рдФрд░ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЧрдгрди рдХреЗ рд▓рд┐рдП GetCategory()рдкрджреНрдзрддрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред
- рджреВрд╕рд░реЗ, рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ 90% рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЕрдЪреНрдЫрд╛ рдХреЛрдб рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Ok рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдк рдЗрди 90% рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ 10% рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреА рд╣реЛрдЧреАред
рддреЛ, рдЪрд▓реЛ рдкрд╣рд▓реЗ рдХрд╛рд░реНрдп рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВ - рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╢реНрд░реЗрдгреА рдЧрдгрдирд╛ред рдореЗрд░реЗ рд╕рд╣рдХрд░реНрдореА рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЕрдкрдиреЗ рд╕рдВрд▓рдЧреНрди рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдПрдХ рддрд░реНрдХреЛрдВ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕реА рд╕рдВрд░рдЪрдирд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ
 template <typename... Types> struct EnumTypeRegister{};  
рдЕрдм рдПрдХ рдирдИ рдЧрдгрдирд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕реЗ рдПрдХ рд╢реНрд░реЗрдгреА рджреНрд╡рд╛рд░рд╛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рдо рдмрд╕ рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ
 using CategoryErrorsList = EnumTypeRegister<Cpu_Error, Measure_Error>; 
рдпрджрд┐ рдЕрдЪрд╛рдирдХ рд╣рдореЗрдВ рдПрдХ рдФрд░ рдПрдиреНрдпреВрдорд░реЗрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдмрд╕ рдЗрд╕реЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
 using CategoryErrorsList = EnumTypeRegister<Cpu_Error, Measure_Error, My_Error>; 
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╣рдорд╛рд░реА рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╢реНрд░реЗрдгреА рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рд╕реВрдЪреА рдореЗрдВ рдПрдХ рд╕реНрдерд┐рддрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЕрд░реНрдерд╛рддреНред 
Cpu_Error рдпрд╣ 
0 рд╣реИ , 
Measure_Error рдпрд╣ 
1 рд╣реИ , 
My_Error рдпрд╣ 
2 рд╣реИ ред рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рдХреЛ рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред C ++ 14 рдХреЗ рд▓рд┐рдП, рд╣рдо рдпрд╣ рдХрд░рддреЗ рд╣реИрдВ:
 template <typename QueriedType, typename Type> constexpr tU32 GetEnumPosition(EnumTypeRegister<Type>) { static_assert(std::is_same<Type, QueriedType>::value, "     EnumTypeRegister"); return tU32(0U) ; } template <typename QueriedType, typename Type, typename... Types> constexpr std::enable_if_t<std::is_same<Type, QueriedType>::value, tU32> GetEnumPosition(EnumTypeRegister<Type, Types...>) { return 0U ; } template <typename QueriedType, typename Type, typename... Types> constexpr std::enable_if_t<!std::is_same<Type, QueriedType>::value, tU32> GetEnumPosition(EnumTypeRegister<Type, Types...>) { return 1U + GetEnumPosition<QueriedType>(EnumTypeRegister<Types...>()) ; } 
рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, 
GetEnumPosition<T<>> рдлрд╝рдВрдХреНрд╢рди, рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде 
EnumTypeRegister Enumerated рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ 
EnumTypeRegister<Cpu_Error, Measure_Error, My_Error> , рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ 
T рдПрдХ рдПрдиреНрдпреВрдорд░реЗрдЯреЗрдб рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╣рдореЗрдВ рдЦреЛрдЬрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реВрдЪреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ T рд╕реВрдЪреА рдореЗрдВ рдХрд┐рд╕реА рдПрдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ "рдЯрд╛рдЗрдк EnumTypeRegister рд╕реВрдЪреА рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдирд╣реАрдВ рд╣реИ" рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ
 
рдЖрдЗрдП рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВред рд╕рдмрд╕реЗ рдХрдо рдХрд╛рд░реНрдп
 template <typename QueriedType, typename Type, typename... Types> constexpr std::enable_if_t<!std::is_same<Type, QueriedType>::value, tU32> GetEnumPosition(TypeRegister<Type, Types...>) { return 1U + GetEnumPosition<QueriedType>(TypeRegister<Types...>()) ; } 
рдпрд╣рд╛рдВ рд╢рд╛рдЦрд╛ 
std::enable_if_t< !std::is_same .. рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрд░реЛрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реВрдЪреА рдореЗрдВ рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ 
GetEnumPosition рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд▓реМрдЯрд╛ рдкреНрд░рдХрд╛рд░ 
GetEnumPosition рд╣реЛрдЧрд╛ рдФрд░ рдлрд┐рд░ рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЙрд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рдлрд┐рд░ рд╕реЗред , рдЬрдмрдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 
1 рд╕реЗ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдФрд░ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп 
1 рд╕реЗ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рдЗрд╕ рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рд╣реЛрдЧрд╛:
 
рдПрдХ рдмрд╛рд░ рд╕реВрдЪреА рдХреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, 
std::enable_if_t GetEnumPosition() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕ рд╕рдордп рдкрд░ рдпрд╣ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧреА:
 
рд╕реВрдЪреА рдореЗрдВ рдЯрд╛рдЗрдк рд╣реЛрдиреЗ рдкрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдПрдХ рдЕрдиреНрдп рд╢рд╛рдЦрд╛ рдХрд╛рдо рдХрд░реЗрдЧреА, рд╢рд╛рдЦрд╛ c 
std::enable_if_t< std::is_same .. :
 template <typename QueriedType, typename Type, typename... Types> constexpr std::enable_if_t<std::is_same<Type, QueriedType>::value, tU32> GetEnumPosition(TypeRegister<Type, Types...>) { return 0U ; } 
рдпрд╣рд╛рдБ рдкреНрд░рдХрд╛рд░ 
std::enable_if_t< std::is_same ... рдХреЗ рд╕рдВрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрд╛рдБрдЪ рд╣реИ 
std::enable_if_t< std::is_same ... рдФрд░, рдпрджрд┐ рдЗрдирдкреБрдЯ рдкрд░ рдХрд╣реЗрдВ рддреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ 
Measure_Error , рддреЛ рдирд┐рдореНрди рдЕрдиреБрдХреНрд░рдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ:
 
рджреВрд╕рд░реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, рдкреБрдирд░рд╛рд╡рд░реНрддреА рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ 1 (рдкрд╣рд▓реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐) + 0 (рджреВрд╕рд░реА) рд╕реЗ = 
1 рдорд┐рд▓рддрд╛ рд╣реИ - рдпрд╣ рд╕реВрдЪреА 
EnumTypeRegister<Cpu_Error, Measure_Error, My_Error> рд╕реВрдЪреА рдореЗрдВ 
EnumTypeRegister<Cpu_Error, Measure_Error, My_Error> рдХрд╛ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИред
рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ 
constexpr, рдХрд╛рд░реНрдп рд╣реИ 
constexpr, рд╕рднреА рдЧрдгрдирд╛ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдХреЛрдИ рднреА рдХреЛрдб рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдпрд╣ рд╕рдм рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрд╛, C ++ 17 рдХреЗ рдирд┐рдкрдЯрд╛рди рдореЗрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореЗрд░рд╛ IAR рдХрдВрдкрд╛рдЗрд▓рд░ C ++ 17 рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдкреВрд░реЗ рдлреБрдЯрдХреНрд▓реЙрде рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕реЗ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рдерд╛:
 
рдпрд╣ рдЕрднреА рднреА рд╣реЛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд░реАрдХреЗ 
GetCategory() рдФрд░ 
GetOk() , рдЬреЛ 
GetEnumPosition ред
 template<typename T> constexpr tU32 GetCategory(const T) { return static_cast<tU32>(GetEnumPosition<T>(categoryDictionary)); } template<typename T> constexpr tU32 GetOk(const T) { return static_cast<tU32>(T::Ok); } 
рд╡рд╣ рд╕рдм рд╣реИред рдЖрдЗрдП рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рд╡рд╕реНрддреБ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:
 ReturnCode result(Measure_Error::Ok) ; 
рдЖрдЗрдП 
ReturnCode рдХреНрд▓рд╛рд╕ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдкрд╛рд╕ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ
 template<class T> explicit ReturnCode(const T initReturnCode): errorValue(static_cast<tU32>(initReturnCode)), errorCategory(GetCategory(initReturnCode)), goodCode(GetOk(initReturnCode)) { static_assert(std::is_enum<T>::value, "The type have to be enum") ; } 
рдпрд╣ рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдПрдХ рд╣реИ, рдФрд░ рдпрджрд┐ 
T рдПрдХ 
Measure_Error рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ 
GetCategory(Measure_Error) рд╡рд┐рдзрд┐ рдХрд╛ 
GetCategory(Measure_Error) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП, рдЬреЛ 
Measure_Error , рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ 
GetEnumPosition рд╕рд╛рде 
GetEnumPosition<Measure_Error>(EnumTypeRegister<Cpu_Error, Measure_Error, My_Error>) рдЬреЛ рд╕реВрдЪреА рдореЗрдВ 
Measure_Error рдХреА рд╕реНрдерд┐рддрд┐ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╕реНрдерд┐рддрд┐ 
1 рд╣реИ ред рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ 
Measure_Error рдкреНрд░рдХрд╛рд░ рдкрд░ рдкреВрд░реА рд░рдЪрдирд╛ рдХреЛрдб рдХреЛ 
Measure_Error рдХреЗ рд╕рд╛рде 
Measure_Error рдЬрд╛рддрд╛ рд╣реИ:
 explicit ReturnCode(const Measure_Error initReturnCode): errorValue(1), errorCategory(1), goodCode(1) { } 
рдкрд░рд┐рдгрд╛рдо
рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдЬреЛ 
ReturnCode рдХрд╛ рдЙрдкрдпреЛрдЧ 
ReturnCode рд╣реИ 
ReturnCode рдЙрд╕рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рд╣реИ:
рд╕реВрдЪреА рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░рдЧрдгрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВред
 
рдФрд░ рдХреЛрдИ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЖрдВрджреЛрд▓рдиреЛрдВ рдирд╣реАрдВ, рдореМрдЬреВрджрд╛ рдХреЛрдб рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ, рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕реВрдЪреА рдореЗрдВ рдЯрд╛рдЗрдк рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рдм рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╕рдВрдХрд▓рдХ рди рдХреЗрд╡рд▓ рд╕рднреА рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛, рдмрд▓реНрдХрд┐ рдЖрдкрдХреЛ рдЪреЗрддрд╛рд╡рдиреА рднреА рджреЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдЯрд╛рдЗрдк рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдирд╛ рднреВрд▓ рдЧрдП рд╣реИрдВ, рдпрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рдЬреЛ рдЧреИрд░-рдЧрдгрдирд╛ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред
рдирд┐рд╖реНрдкрдХреНрд╖рддрд╛ рдореЗрдВ, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЙрди 10% рдХреЛрдб рдореЗрдВ рдЬрд╣рд╛рдВ рдПрдиреНрдпреВрдорд░реЗрд╢рди рдХрд╛ рдУрдХреЗ рдХреЛрдб рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЕрд▓рдЧ рдирд╛рдо рд╣реИ, рдЖрдкрдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдмрдирд╛рдиреА рд╣реЛрдЧреАред
 template<> constexpr tU32 GetOk<MyError>(const MyError) { return static_cast<tU32>(MyError::Good) ; } ; 
рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдПрдХ рдЫреЛрдЯрд╛ рдЙрджрд╛рд╣рд░рдг рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛: 
рдХреЛрдб рдЙрджрд╛рд╣рд░рдгрд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣рд╛рдВ рдПрдХ рдЖрд╡реЗрджрди рд╣реИ:
 enum class Cpu_Error { Ok, Alu, Rom, Ram } ; enum class Measure_Error { OutOfLimits, Ok, BadCode } ; enum class My_Error { Error1, Error2, Error3, Error4, Ok } ;  
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ:
рд░рд┐рдЯрд░реНрди рдХреЛрдб: 3 рд░рд┐рдЯрд░реНрди рд╢реНрд░реЗрдгреА: 0
рд░рд┐рдЯрд░реНрди рдХреЛрдб: 3 рд░рд┐рдЯрд░реНрди рд╢реНрд░реЗрдгреА: 2
рд░рд┐рдЯрд░реНрди рдХреЛрдб: 2 рд░рд┐рдЯрд░реНрди рд╢реНрд░реЗрдгреА: 1
mError: 1