c++ 使用布尔变量的替代方法,以使程序的下一步能够继续(不提前返回)

hpcdzsge  于 2023-03-20  发布在  其他
关注(0)|答案(3)|浏览(115)

我在一个函数中有几个步骤,如果一个步骤失败了,我不想执行后面的步骤,我也希望只有一个return语句,其中一个选项是嵌套的if-else,但这会很麻烦,所以我甚至不会在这里举一个例子。
我一直在做的事情是这样的(假设step_n函数返回bool):

bool my_function()
{
   bool succeeded;

   succeeded = step_1();

   if(succeeded)
   {
      succeeded = step_2();
   }

   if(succeeded)
   {
      succeeded = step_3();
   }

   ...

   if(succeeded)
   {
      succeeded = step_n();
   }

   return succeeded;
}

这似乎是我能想到的最好的情况,但是当函数不返回bool时,我必须对每个函数调用做额外的检查,事情可能会变得非常重复和丑陋。
有什么现代c++方法可以实现同样的想法吗?

zphenhs4

zphenhs41#

此代码与您所显示的代码等效。

bool my_function()
{
   return step_1() &&
          step_2() &&
          step_3() &&
   ... 
          step_n();
}

尽管它并不“现代”,任何版本的C++都可以做到这一点。

qmb5sa22

qmb5sa222#

(puts防火服)

bool func(){
     bool success = false; 
     if(!func1()) goto out;
     if(!func2()) goto out;
     if(!func3()) goto out;
     success = true;
    out:
     return success;
   }
bkhjykvo

bkhjykvo3#

这将是内存效率低下,但不太容易出错:

auto const steps =
std::to_array<std::function<bool()>({
    [&]{/*TODO:step_1 instructions*/},
    [&]{/*TODO:step_2 instructions*/},
    //TODO: more steps...
    [&]{/*TODO:step_n instructions*/}
});

for(auto const& f:steps)
    if (!f());
       break;

您也可以使用std::find_if-而不是原始for循环-来计算执行的步骤:

auto step_count=distance(
     begin(steps),
     std::find_if(
          begin(steps),
          end(steps),
          [](auto const & f)/*->bool*/
            {return !f();}));

所需的标准头文件为:

#include <array>
#include <iterator>
#include <algorithm>
#include <functional>

相关问题