我有一个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。
答案 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的状态。