рдПрдХреАрдХреГрдд рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ (рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд▓рд┐рдП C ++ рд╡рд┐рдХрд▓реНрдк)

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 ; //GetLastError()   Cpu_Error result = cpuDiagnostic.GetLastError() ; if(result) //    { //       Logger::Log(result) ; } //GetLastError()   Measure_Error result = measureDiagnostic.GetLastError() ; if(result) //    { //       Logger::Log(result) ; } 

рдпрд╛ рддреЛ:

 ReturnCode result ; for(auto it: diagnostics) { //GetLastError()     result = it.GetLastError() ; if (result) //    { Logger::Log(result) ; //      } } 

рдпрд╛ рддреЛ:

 void CpuDiagnostic::SomeFunction(ReturnCode errocode) { Cpu_Error status = errorcode ; switch (status) { case CpuError::Alu: // do something ; break; .... } } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреБрдЫ рдХреНрд▓рд╛рд╕ ReturnCode рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЛрдб рдФрд░ рдЙрд╕рдХреА рд╢реНрд░реЗрдгреА рджреЛрдиреЛрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╡рд░реНрдЧ std::error_code , рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдЧрднрдЧ рдпрд╣ рд╕рдм рдХрд░рддрд╛ рд╣реИред рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЗрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдпрд╣рд╛рдБ рд╡рд░реНрдгрд┐рдд рд╣реИ:

рдЖрдкрдХрд╛ рдЕрдкрдирд╛ std :: code_error
C ++ рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди
рднрд╡рд┐рд╖реНрдп рдХреЗ "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 , рдХрд┐рд╕реА рднреА рдПрдиреНрдпреВрдорд░реЗрдЯреЗрдб рдЯрд╛рдЗрдк рдХреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдореЗрдВ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдФрд░ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд╕реЗ рдПрдиреНрдпреВрдорд░реЗрдЯреЗрдб рдЯрд╛рдЗрдк рдХреЗ рд╡рд┐рдкрд░реАрддред рдЗрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╢реНрд░реЗрдгреА рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп, рд╕рд╛рде рд╣реА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

 //GetLastError()   CpuError ReturnCode result(cpuDiagnostic.GetLastError()) ; if(result) //    { ... } 

рдирд┐рд░реНрдгрдп


рдХрдХреНрд╖рд╛ рдХреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛрдб, рдПрдХ рд╢реНрд░реЗрдгреА рдХреЛрдб рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдиреБрд░реВрдк рдПрдХ рдХреЛрдб, рдПрдХ рд╕рдВрдЪрд╛рд▓рдХ рдФрд░ рдПрдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдирд┐рдореНрди рд╡рд░реНрдЧ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:



рдХрдХреНрд╖рд╛ рдХреЛрдб
 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 { //Cast to only enum types static_assert(std::is_enum<T>::value, "   ") ; return static_cast<T>(errorValue) ; } tU32 GetValue() const { return errorValue; } tU32 GetCategoryValue() const { return errorCategory; } operator bool() const { return (GetValue() != goodCode); } template<class T> ReturnCode& operator=(const T returnCode) { errorValue = static_cast<tU32>(returnCode) ; errorCategory = GetCategory(returnCode) ; goodCode = GetOk(returnCode) ; return *this ; } private: tU32 errorValue = 0U ; tU32 errorCategory = 0U ; tU32 goodCode = 0U ; } ; 


рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

  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 { //Cast to only enum types static_assert(std::is_enum<T>::value, "   ") ; return static_cast<T>(errorValue) ; } 

рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдПрдиреНрдпреВрдорд░реЗрдЯреЗрдб рдкреНрд░рдХрд╛рд░ рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

  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); } 

рдпрд╣ рд╣рдореЗрдВ рд╕реАрдзреЗ рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд░рд┐рдЯрд░реНрди рдХреЛрдб рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реИ:

 //GetLastError()   Cpu_Error ReturnCode result(cpuDiagnostic.GetLastError()) ; if(result) //    { ... } 

рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╕рднреА рд╣реИред рдкреНрд░рд╢реНрди 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 рд╕реВрдЪреА рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдирд╣реАрдВ рд╣реИ" рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ

 //..    constexpr EnumTypeRegister<Cpu_Error, Measure_Error, My_Error> list //  GetEnumPosition<Measure_Error>(list) //   1 -    Measure_Error   . 

рдЖрдЗрдП рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВред рд╕рдмрд╕реЗ рдХрдо рдХрд╛рд░реНрдп

 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 рд╕реЗ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рдЗрд╕ рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рд╣реЛрдЧрд╛:

 //Iteration 1, 1+: tU32 GetEnumPosition<T>(EnumTypeRegister<Cpu_Error, Measure_Error, My_Error>) //Iteration 2, 1+1+: tU32 GetEnumPosition<T>(EnumTypeRegister<Measure_Error, My_Error>) //Iteration 3, 1+1+1: tU32 GetEnumPosition<T>(EnumTypeRegister<My_Error>) 

рдПрдХ рдмрд╛рд░ рд╕реВрдЪреА рдХреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, std::enable_if_t GetEnumPosition() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕ рд╕рдордп рдкрд░ рдпрд╣ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧреА:

 //         GetEnumPosition<T>(TypeRegister<>) template <typename QueriedType, typename Type> constexpr tU32 GetEnumPosition(EnumTypeRegister<Type>) { static_assert(std::is_same<Type, QueriedType>::value, "     EnumTypeRegister"); return tU32(0U) ; } 

рд╕реВрдЪреА рдореЗрдВ рдЯрд╛рдЗрдк рд╣реЛрдиреЗ рдкрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдПрдХ рдЕрдиреНрдп рд╢рд╛рдЦрд╛ рдХрд╛рдо рдХрд░реЗрдЧреА, рд╢рд╛рдЦрд╛ 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 , рддреЛ рдирд┐рдореНрди рдЕрдиреБрдХреНрд░рдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ:

 //Iteration 1, tU32 GetEnumPosition<Measure_Error>(EnumTypeRegister<Cpu_Error, Measure_Error, My_Error>) { return 1U + GetEnumPosition<Measure_Error>(EnumTypeRegister<Measure_Error, My_Error>) } //Iteration 2: tU32 GetEnumPosition<Measure_Error>(EnumTypeRegister<Measure_Error, My_Error>) { return 0 ; } 

рджреВрд╕рд░реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, рдкреБрдирд░рд╛рд╡рд░реНрддреА рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ 1 (рдкрд╣рд▓реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐) + 0 (рджреВрд╕рд░реА) рд╕реЗ = 1 рдорд┐рд▓рддрд╛ рд╣реИ - рдпрд╣ рд╕реВрдЪреА EnumTypeRegister<Cpu_Error, Measure_Error, My_Error> рд╕реВрдЪреА рдореЗрдВ EnumTypeRegister<Cpu_Error, Measure_Error, My_Error> рдХрд╛ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИред

рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ constexpr, рдХрд╛рд░реНрдп рд╣реИ constexpr, рд╕рднреА рдЧрдгрдирд╛ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдХреЛрдИ рднреА рдХреЛрдб рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдпрд╣ рд╕рдм рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрд╛, C ++ 17 рдХреЗ рдирд┐рдкрдЯрд╛рди рдореЗрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореЗрд░рд╛ IAR рдХрдВрдкрд╛рдЗрд▓рд░ C ++ 17 рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдкреВрд░реЗ рдлреБрдЯрдХреНрд▓реЙрде рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕реЗ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рдерд╛:

 //for C++17 template <typename QueriedType, typename Type, typename... Types> constexpr tU32 GetEnumPosition(EnumTypeRegister<Type, Types...>) { //        if constexpr (std::is_same<Type, QueriedType>::value) { return 0U ; } else { return 1U + GetEnumPosition<QueriedType>(EnumTypeRegister<Types...>()) ; } } 

рдпрд╣ рдЕрднреА рднреА рд╣реЛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд░реАрдХреЗ 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 рдЙрд╕рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рд╣реИ:
рд╕реВрдЪреА рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░рдЧрдгрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВред

 // Add enum in the category using CategoryErrorsList = EnumTypeRegister<Cpu_Error, Measure_Error, My_Error>; 

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

рдирд┐рд╖реНрдкрдХреНрд╖рддрд╛ рдореЗрдВ, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЙрди 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 } ; // Add enum in the category list using CategoryErrorsList = EnumTypeRegister<Cpu_Error, Measure_Error, My_Error>; Cpu_Error CpuCheck() { return Cpu_Error::Ram; } My_Error MyCheck() { return My_Error::Error4; } int main() { ReturnCode result(CpuCheck()); //cout << " Return code: "<< result.GetValue() // << " Return category: "<< result.GetCategoryValue() << endl; if (result) //if something wrong { result = MyCheck() ; // cout << " Return code: "<< result.GetValue() // << " Return category: "<< result.GetCategoryValue() << endl; } result = Measure_Error::BadCode ; //cout << " Return code: "<< result.GetValue() // << " Return category: "<< result.GetCategoryValue() << endl; result = Measure_Error::Ok ; if (!result) //if all is Ok { Measure_Error mError = result ; if (mError == Measure_Error::Ok) { // cout << "mError: "<< tU32(mError) << endl; } } return 0; } 

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ:
рд░рд┐рдЯрд░реНрди рдХреЛрдб: 3 рд░рд┐рдЯрд░реНрди рд╢реНрд░реЗрдгреА: 0
рд░рд┐рдЯрд░реНрди рдХреЛрдб: 3 рд░рд┐рдЯрд░реНрди рд╢реНрд░реЗрдгреА: 2
рд░рд┐рдЯрд░реНрди рдХреЛрдб: 2 рд░рд┐рдЯрд░реНрди рд╢реНрд░реЗрдгреА: 1
mError: 1

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


All Articles