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