Enumerations and State
Scoped Enums
enum class keeps enum names inside the enum type.
scoped enum
A scoped enum uses names such as `Role::Admin`, which helps avoid accidental name conflicts.
Scoped Enums
scoped_enums.cpp
Replay: real traced execution (multi-file project)
#include <iostream>
#include <string>
enum class Role {
Guest,
Member,
Admin
};
std::string label(Role role) {
if (role == Role::Admin) {
return "admin";
}
if (role == Role::Member) {
return "member";
}
return "guest";
}
int main() {
Role role = Role::Member;
bool canEdit = role == Role::Admin;
std::cout << "role=" << label(role) << std::endl;
std::cout << "canEdit=" << canEdit << std::endl;
return 0;
}
#include <iostream>
#include <string>
enum class Role {
Guest,
Member,
Admin
};
std::string label(Role role) {
if (role == Role::Admin) {
return "admin";
}
if (role == Role::Member) {
return "member";
}
return "guest";
}
int main() {
Role role = Role::Guest;
bool canEdit = role == Role::Admin;
std::cout << "role=" << label(role) << std::endl;
std::cout << "canEdit=" << canEdit << std::endl;
return 0;
}
#include <iostream>
#include <string>
enum class Role {
Guest,
Member,
Admin
};
std::string label(Role role) {
if (role == Role::Admin) {
return "admin";
}
if (role == Role::Member) {
return "member";
}
return "guest";
}
int main() {
Role role = Role::Admin;
bool canEdit = role == Role::Admin;
std::cout << "role=" << label(role) << std::endl;
std::cout << "canEdit=" << canEdit << std::endl;
return 0;
}
role ← 1, canEdit ← 0
20int main() {21 Role role→ 1 = Role::Member; //@role=Role::Guest, Role::Admin2223 bool canEdit→ 0 = role1 == Role::Admin;2425 std::cout << "role=" << label(role1) << std::endl;26 std::cout << "canEdit=" << canEdit << std::endl;std::string label(Role role)
10std::string label(Role role1) {11 if (role == Role::Admin) {if (role == Role::Member)
13}14if (role1 == Role::Member) {15 return "member";16}std::cout << "role=" << label(role) << std::endl;
25 std::cout << "role=" << label(role1) << std::endl;26 std::cout << "canEdit=" << canEdit0 << std::endl;27 return 0;28}outputrole=member canEdit=0
role ← 0, canEdit ← 0
20int main() {21 Role role→ 0 = Role::Guest;2223 bool canEdit→ 0 = role0 == Role::Admin;2425 std::cout << "role=" << label(role0) << std::endl;26 std::cout << "canEdit=" << canEdit << std::endl;std::string label(Role role)
10std::string label(Role role0) {11 if (role == Role::Admin) {12 return "admin";13 }14 if (role == Role::Member) {15 return "member";16 }17 return "guest";18}std::cout << "role=" << label(role) << std::endl;
25 std::cout << "role=" << label(role0) << std::endl;26 std::cout << "canEdit=" << canEdit0 << std::endl;27 return 0;28}outputrole=guest canEdit=0
role ← 2, canEdit ← 1
20int main() {21 Role role→ 2 = Role::Admin;2223 bool canEdit→ 1 = role2 == Role::Admin;2425 std::cout << "role=" << label(role2) << std::endl;26 std::cout << "canEdit=" << canEdit << std::endl;std::string label(Role role)
10std::string label(Role role2) {11 if (role == Role::Admin) {if (role == Role::Admin)
10std::string label(Role role) {11 if (role2 == Role::Admin) {12 return "admin";13 }std::cout << "role=" << label(role) << std::endl;
25 std::cout << "role=" << label(role2) << std::endl;26 std::cout << "canEdit=" << canEdit1 << std::endl;27 return 0;28}outputrole=admin canEdit=1