Основная идея перечислений заключается в том, что вы можете определить набор констант, которые дают пользователю и компилятору некоторые подсказки о том, как использовать переменную.
Ваш пример будет более понятным, еслиФункция change_light будет принимать аргумент lights следующим образом:
std::string change_light (lights choice)
{
switch(choice)
{
case red: return "red";
case yellow: return "yellow";
case green: return "green";
}
}
Таким образом, компилятор знает, что функция принимает только определенные аргументы, и вы не получаете вызовы функций, такие как change_light ("blue")
Таким образом, вы используете перечисления для защиты остальной части вашего кода от неправильных значений аргументов.Вы не можете напрямую прочитать перечисление из std :: in, так как оно ничего не знает о вашем перечислении.После прочтения вы должны преобразовать ввод в перечисление.Примерно так:
lights string_to_ligths(std::string choice)
{
if(choice == "red") return red;
if(choice == "yellow") return yellow;
if(choice == "green") return green;
}
С этого момента все ваши функции, связанные со светофором, принимают только значения enum и не нужно проверять, находится ли значение запроса в допустимом диапазоне.