计算表达式直到一个 returns 为真
Evaluate expressions until one returns true
我有一个 savePotentiometerState(...)
函数,returns true
如果有更改要保存, false
如果什么都没做。此外,我知道在通过我的主循环的任何一次传递中,最多一个电位器可能已经改变(由于它们的读出方式)。
这是在时间非常有限的嵌入式平台上进行的,因此重要的(或至少重要的是)我不会比必须的更频繁地调用 savePotentiometerState
。然而,我想出的代码自然看起来很愚蠢,可能会在 thedailywtf:
if (!savePotentiometerState(pot1))
if (!savePotentiometerState(pot2))
...
if (!savePotentiometerState(potn));
另一种方法是使用短路评估:
const bool retval = savePotentiometerState(pot1) || savePotentiometerState(pot2) || ... || savePotentiometerState(potn);
我想我什至可以在这里放弃作业。但这也不是很好的风格,因为我在滥用 ||
运算符的短路。
各种 potn
对象是包含 class 的成员变量,因此没有明显的方法将其编写为循环。
我觉得我在这里遗漏了一些明显的东西,所以我的问题是:是否有 idiomatic/easy 阅读方式来做到这一点,而不牺牲效率?如果重要的话,我正在使用 C++17。
循环似乎是可行的方法:
for (auto& pot : {std::ref(pot1), std::ref(pot2), /*..,*/ std::ref(potn)}) {
if (savePotentiometerState(pot)) {
break;
}
}
就个人而言 - 我会避免使用您正在使用的算法。
我会一直保存每个罐子的状态;并跟踪当前和以前的值;然后仅在值发生变化时才调用给定的回调。
这样一来,savePotState
总是能达到给定底池所需的速度;而且你永远不会进入 pot1 到 pot(n-1) 可以阻止 potn 被读取的状态。
由于您可以使用 C++17,因此您可以利用 fold expressions 并编写一个辅助函数来为您进行评估。
template<typename... Args>
bool returtnPotentiometerState(Args&&... args)
{
return (... || savePotentiometerState(args));
}
然后你会这样称呼它
if (returtnPotentiometerState(pot1, pot2, ..., potn))
这意味着你没有回路,你会短路。
我有一个 savePotentiometerState(...)
函数,returns true
如果有更改要保存, false
如果什么都没做。此外,我知道在通过我的主循环的任何一次传递中,最多一个电位器可能已经改变(由于它们的读出方式)。
这是在时间非常有限的嵌入式平台上进行的,因此重要的(或至少重要的是)我不会比必须的更频繁地调用 savePotentiometerState
。然而,我想出的代码自然看起来很愚蠢,可能会在 thedailywtf:
if (!savePotentiometerState(pot1))
if (!savePotentiometerState(pot2))
...
if (!savePotentiometerState(potn));
另一种方法是使用短路评估:
const bool retval = savePotentiometerState(pot1) || savePotentiometerState(pot2) || ... || savePotentiometerState(potn);
我想我什至可以在这里放弃作业。但这也不是很好的风格,因为我在滥用 ||
运算符的短路。
各种 potn
对象是包含 class 的成员变量,因此没有明显的方法将其编写为循环。
我觉得我在这里遗漏了一些明显的东西,所以我的问题是:是否有 idiomatic/easy 阅读方式来做到这一点,而不牺牲效率?如果重要的话,我正在使用 C++17。
循环似乎是可行的方法:
for (auto& pot : {std::ref(pot1), std::ref(pot2), /*..,*/ std::ref(potn)}) {
if (savePotentiometerState(pot)) {
break;
}
}
就个人而言 - 我会避免使用您正在使用的算法。
我会一直保存每个罐子的状态;并跟踪当前和以前的值;然后仅在值发生变化时才调用给定的回调。
这样一来,savePotState
总是能达到给定底池所需的速度;而且你永远不会进入 pot1 到 pot(n-1) 可以阻止 potn 被读取的状态。
由于您可以使用 C++17,因此您可以利用 fold expressions 并编写一个辅助函数来为您进行评估。
template<typename... Args>
bool returtnPotentiometerState(Args&&... args)
{
return (... || savePotentiometerState(args));
}
然后你会这样称呼它
if (returtnPotentiometerState(pot1, pot2, ..., potn))
这意味着你没有回路,你会短路。