对不起那些难以捉摸的标题感到抱歉,但这里是我将用来解释我的问题的代码!
false
如何避免为while(motors[0].cycle <= maxcycle
&& motors[1].cycle <= maxcycle
&& motors[2].cycle <= maxcycle
&& motors[3].cycle <= maxcycle
&& motors[4], etc ...)
循环键入这么长的条件,因为我总是检查相同的参数,只有我的结构的索引正在改变。
答案 0 :(得分:6)
我怎么能避免输入这么长的条件,知道我总是检查相同的参数,只有我的结构的索引正在改变。
添加一个函数来执行检查并使用while
语句中的函数。
// MotorType is my contrived type. Use the right type.
bool doCheck(MotorType* motors, int count, int maxcycle)
{
for (int i = 0; i < count; ++i )
{
if ( !(motors[0].cycle <= maxcycle) )
{
return false;
}
}
return true;
}
while(doCheck(motors, count, maxcycle))
{
}
答案 1 :(得分:4)
C ++ 11及更高版本允许您使用 lambda 将自定义检查功能折叠为std::all_of
的调用:
while (std::all_of(std::begin(motors), std::end(motors),
[=](Motor m){ return m.cycle < maxcycle; }))
{
...
答案 2 :(得分:0)
将条件抽象为方法。
Sorting
然后使用自己的迭代定义该方法:
GridView
答案 3 :(得分:0)
将它分解为一个单独的函数并在单独的函数中遍历数组,并返回true,它会一直执行,如果if检查失败,则返回false。
答案 4 :(得分:0)
你可以循环:
while(true)
{
for(int i = 0, i < number, i++)
{
if (motors[i].cycle > maxcycle)
{
break;
}
}
//Do something
}
答案 5 :(得分:0)
这里建议添加功能的所有答案都做到了......好吧,不一定是最好的方法。原因如下:
由于循环被置于单独的函数中,并且motors
的数量不是常量,编译器很可能使用实际循环而不会展开它。当您计算纳秒时,自然循环会对性能造成危害。
但是,原始示例没有这个问题,因为它根本没有循环。
解决方案:提供一个根本不使用循环的函数,或者让编译器更容易展开它。
答案 6 :(得分:0)
将它放入lambda的检查中:
#include <algorithm>
...
void myFunction(){
auto allCycling = [&]() -> bool { // lambda function, capture by reference
return std::all_of( // for every element in the given range
motors.begin(), motors.end(), // given range is all of the motors container
[](const decltype(motors[0])& motor) -> bool {
return motor.cycle <= maxcycle; // check
});
while(allCycling()){
//do stuff
}
}
通过引用[&]
捕获lambda,可以访问lambda中的所有函数范围变量,而无需担心复制它们的成本。
答案 7 :(得分:0)
我将投入TMP版本:
template < size_t I >
struct check_it
{
static bool call(motor_type * motors)
{
return check_it<I-1>::call(motors) && motors[I].cycles <= maxcycles;
}
}
template < >
struct check_it<0>
{
static bool call(motor_type * motors) { return motors[0].cycles <= maxcycles; }
};
while (check_it<42>::call(motors)) { ... }
编辑:我不一定推荐这个,但它应该优化到你写的内容。很难说它实际上是否更快。将取决于缓存中有多少指令等...也许?您想要了解它是否重要。