如果C ++中的分支太多了

时间:2017-08-10 16:47:53

标签: c++ if-statement

我正在开发一个最初用C编写的项目。几年前,只进行了一些小的更改,源代码是在C ++下编译的。项目非常庞大,不幸的是它看起来像这样:

#define DEVICE_A 0
#define DEVICE_B 1
..
#define DEVICE_N 50

#define COMPANY_A 0
#define COMPANY_B 1
..
#define COMPANY_N 50

//and now the interesting part in other files:
if(giCompany == COMPANY_A || giCompany == COMPANY_B || 
giCompany != COMPANY_C && giDevice == DEVICE_A)
{
//... do something 
}
else
{
   if(giCompany == COMPANY_D)
   {
   // so something different
   }
}// and so on ... 

在C ++中处理如此多的if-elses的最佳方法是什么?我的例子真的很小,在真正的代码中更糟糕的是,如果分支有很多,分析它需要很长时间......项目是如此之大,以至于我不会触及现有的代码,而是添加了这样的混乱就像现在我不想做的那样。我开始使用多态(每个设备的接口设备必须实现自己的方法,而不是创建另一个if / else分支),它看起来好多了。但我想问一下,在C ++中处理这种 if / else 问题的常用方法是什么。

2 个答案:

答案 0 :(得分:1)

使用switch-case:

it { is_expected.to install_python_package('foo') }

如果使用第二个变量(如switch(giCompany) { case COMPANY_A: case COMPANY_B: { // Stuff break; } case COMPANY_C: { // Stuff break; } // ... } )进行额外检查,那将会有点棘手

答案 1 :(得分:-2)

如果所述比较函数返回std::vector,您可以创建一个true来保存2个函数:一个用于比较(如同语句标题),另一个用于操作。

例如:

std::vector<std::pair<std::function<bool()>, std::function<void()>>> operations =
    {
        {
        [=]
            {
            return giCompany == COMPANY_A || giCompany == COMPANY_B ||
                   giCompany != COMPANY_C && giDevice == DEVICE_A;
            },
        [&] { /*... do something */ }
        },
        {
        [=] {return giCompany == COMPANY_D;},
        [&] { /* do something different */ }
        },
    };

for (auto const& pair: operations)
    {
    if (pair.first ())
        {
        pair.second ();
        }
    }

Live Demo

或者,如果所有if-else个案例仅依赖于giCompanygiDevice,则可以将它们作为参数传递给仿函数:

std::vector<std::pair<std::function<bool(int, int)>, std::function<void()>>> operations =
    {
        {
        [] (int company, int device)
            {
            return company == COMPANY_A || company == COMPANY_B ||
                   company != COMPANY_C && device == DEVICE_A;
            },
        [&] { /*... do something */ }
        },
        {
        [] (int company, int device) {return company == COMPANY_D;},
        [&] { /* do something different */ }
        },
    };

for (auto const& pair: operations)
    {
    if (pair.first (giCompany, giDevice))
        {
        pair.second ();
        }
    }

Live Demo.

由于所有仿函数都在vector中 - 它们将被迭代,并以与if-else树中完全相同的顺序进行求值。但是,如果你想指定,满足某些条件,迭代应该停止,你可以添加一个输出参数:

std::vector<std::pair<std::function<bool(int, int, bool&)>, std::function<void()>>> operations =
    {
        {
        [] (int company, int device, bool& stop)
            {
            stop = true;
            return company == COMPANY_A || company == COMPANY_B ||
                   company != COMPANY_C && device == DEVICE_A;
            },
        [&] { /*... do something */ }
        },
        {
        [] (int company, int device, bool& stop)
            {
            stop = false;
            return company == COMPANY_D;
            },
        [&] { /* do something different */ }
        },
    };

for (auto const& pair: operations)
    {
    bool stop = false;
    if (pair.first (giCompany, giDevice, stop))
        {
        pair.second ();
        }

    if (stop)
        {
        break;
        }
    }