计算表达式,直到返回真

时间:2019-01-30 13:11:56

标签: c++ idiomatic

我有一个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 :(得分:4)

循环似乎是要走的路:

Get-RemoteProgram

答案 1 :(得分:2)

由于您可以使用C ++ 17,因此可以利用fold expressions并编写一个辅助函数来为您进行评估。

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

然后您将其命名为

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

这意味着您没有回路,并且会发生短路。

答案 2 :(得分:1)

个人-我会避免使用您正在使用的算法。

我会一直为每个锅保存状态;并跟踪当前和以前的值;然后仅在值已更改的情况下才调用给定的回调。

这样,savePotState总是和给定锅一样快。而且,您永远不会进入pot1到pot(n-1)会阻止读取potn的状态。