如果分支太多C++

Too many if branches in C++

本文关键字:C++ 太多 分支 如果      更新时间:2023-10-16

我正在做一个最初用 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/else 分支(,它看起来要好得多。但我想问一下,在C++处理这种if/else问题的常用方法是什么。

使用开关大小写:

switch(giCompany)
{
case COMPANY_A:
case COMPANY_B:
{
// Stuff
break;
}
case COMPANY_C:
{
// Stuff
break;
}
// ...
}

如果您使用第二个变量(如giDevice(进行额外检查,它会变得有点棘手

您可以创建一个包含 2 个函数的std::vector:一个用于比较(好像语句头(,另一个用于操作,如果所述比较函数返回true

例如:

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 ();
}
}

现场演示。

或者,

或者,如果所有这些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 ();
}
}

现场演示。


由于所有函子都在一个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;
}
}