3、C++20:使用 using enumC++20 引入了 using enum 语法,这个特性允许你将一个枚举的所有枚举值引入当前作用域,同时不失去作用域枚举的优点。请看下面的示例:enum class ComputeStatus { Ok, Error, FileError, NotEnoughMemory, TimeExceeded, Unknown};在早期的 C++ 版本中,使用这些枚举值时,需要使用枚举类的名称进行限定:ComputeStatus s = ComputeStatus::NotEnoughMemory;C++20 通过 using enum 声明简化了这一点:int main() { using enum ComputeStatus; ComputeStatus s = NotEnoughMemory;}上面的简单代码可能没什么实际意义,但看看下面这个例子:int main() { ComputeStatus s = ComputeStatus::Ok; switch (s) { case ComputeStatus::Ok: std::cout << "ok"; break; case ComputeStatus::Error: std::cout << "Error"; break; case ComputeStatus::FileError: std::cout << "FileError"; break; case ComputeStatus::NotEnoughMemory: std::cout << "NotEnoughMemory"; break; case ComputeStatus::TimeExceeded: std::cout << "Time..."; break; default: std::cout << "unknown..."; }}我们可以将其转换为如下形式:int main() { ComputeStatus s = ComputeStatus::Ok; switch (s) { using enum ComputeStatus; // << << case Ok: std::cout << "ok"; break; case Error: std::cout << "Error"; break; case FileError: std::cout << "FileError"; break; case NotEnoughMemory: std::cout << "NotEnoughMemory"; break; case TimeExceeded: std::cout << "Time..."; break; default: std::cout << "unknown..."; }}或者,也可以看看下面这个例子:struct ComputeEngine { enum class ComputeStatus { Ok, Error, FileError, NotEnoughMemory, TimeExceeded, Unknown }; using enum ComputeStatus;};
int main() { ComputeEngine::ComputeStatus s = ComputeEngine::Ok;}你可以将所有枚举值引入 ComputeEngine 的作用域中,同时享受 enum class 带来的类型安全特性。C++20 的这一改进使代码更加简洁,并减少了冗余,尤其是在某个作用域内频繁使用多个枚举值的情况下。它提供了一种更加流畅和可读的方式,同时不牺牲作用域枚举所提供的类型安全性。
|