Оценивайте выражения, пока не вернетесь - PullRequest
0 голосов
/ 30 января 2019

У меня есть savePotentiometerState(...) -функция, которая возвращает true, если были изменения, чтобы сохранить, и false, если ничего не было сделано.Кроме того, я знаю, что при любом прохождении через мой основной цикл максимум один из потенциометров мог измениться (из-за способа, которым они считываются).

Это встроенный режим с очень ограниченным временемплатформу, поэтому важно (или, по крайней мере, важно), чтобы я не звонил savePotentiometerState чаще, чем должен.Тем не менее, код, который я придумываю, кажется глупым, что может закончиться на thedailywtf:

if (!savePotentiometerState(pot1))
  if (!savePotentiometerState(pot2))
    ...
      if (!savePotentiometerState(potn));

Еще один способ сделать это - использовать оценку короткого замыкания:

const bool retval = savePotentiometerState(pot1) || savePotentiometerState(pot2) || ... || savePotentiometerState(potn);

Полагаю, я мог бы даже отбросить задание здесь.Но это не похоже на хороший стиль, так как я злоупотребляю коротким замыканием оператора ||.

Различные potn объекты являются переменными-членами содержащего класса, поэтому нет очевидногоспособ написать это в виде цикла.

Мне кажется, что я упускаю что-то очевидное здесь, поэтому мой вопрос: есть ли идиоматический / легкий для чтения способ сделать это, который не жертвует эффективностью?Если это имеет значение, я использую C ++ 17.

Ответы [ 3 ]

0 голосов
/ 30 января 2019

Лично - я бы избежал используемого вами алгоритма.

Я бы все время сохранял состояние для каждого банка;и отслеживать текущие и предыдущие значения;и затем вызывать данный обратный вызов только в том случае, если значение изменилось.

Таким образом, savePotState всегда так быстро, как это необходимо для данного банка;и вы никогда не попадете в состояние, в котором pot1 to pot (n-1) может заблокировать чтение potn.

0 голосов
/ 30 января 2019

Поскольку вы можете использовать C ++ 17, вы можете использовать сложить выражения и написать вспомогательную функцию, чтобы выполнить оценку за вас.

template<typename... Args>
bool returtnPotentiometerState(Args&&... args)
{
    return (... || savePotentiometerState(args));
}

, и тогда вы бы назвали ее так:

if (returtnPotentiometerState(pot1, pot2, ..., potn))

Это означает, что у вас нет петли, и вы получаете короткое замыкание.

0 голосов
/ 30 января 2019

Цикл кажется, путь:

for (auto& pot : {std::ref(pot1), std::ref(pot2), /*..,*/ std::ref(potn)}) {
     if (savePotentiometerState(pot)) {
         break;
     }
}
...