Вопрос немного старый, но я хочу внести свой вклад. Я лично предпочитаю раннее возвращение, чтобы избежать вложенных ifs. Также для ваших ситуаций я использую отображения. Я бы написал код, как показано ниже.
if(key_event == NULL)
return;
static const map<pair<int , int> , int> directionMapping = {
make_pair(make_pair(LEFT , UP) , 180) ,
make_pair(make_pair(LEFT , DOWN) , 0) ,
make_pair(make_pair(LEFT , RIGHT) , 90) ,
make_pair(make_pair(LEFT , LEFT) , 270) ,
make_pair(make_pair(RIGHT , UP) , 0) ,
make_pair(make_pair(RIGHT , DOWN) , 180) ,
make_pair(make_pair(RIGHT , RIGHT) , 270) ,
make_pair(make_pair(RIGHT , LEFT) , 90)
};
auto newDirection = directionMapping.at(make_pair(key_event , current_direction));
cout << "New direction is " << newDirection << endl;
Это намного более читабельно, без вложенности, без глубины, более легко обслуживаемо. Например, если вы хотите поддерживать также клавиши со стрелками ВВЕРХ и ВНИЗ, просто добавьте несколько пар в отображение.
Отображение может использоваться для выполнения различных процедур. Посмотри на это
if(type == "Foo")
//Do something
else if(type == "Bar")
//Do another thing
else if(type == "Nothing")
//Do nothing
Способ отображения этого поддерживается после c ++ 11.
static const map<string , function<void()>> fMapping = {
make_pair("Foo" , [](){ cout << "I am doing something"; }),
make_pair("Bar" , [](){ cout << "I am doing another thing"; }) ,
make_pair("Nothing" , [](){ cout << "I am doing nothig"; })
};
string type = "Foo";
fMapping.at(type)();
Обратите внимание, что этот тип отображения очень полезен в классах Factory.