如果分支太多C++
Too many if branches in C++
我正在做一个最初用 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
情况都只依赖于giCompany
和giDevice
,你可以将它们作为参数传递给函子:
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;
}
}
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 错误:字符数组的初始值设定项太多
- 对象实例化调用构造函数的次数太多
- Levenshtein 两个文件的距离花费了太多时间
- 我有三个 getline,但是一旦编译,输入就太多了
- 将使用太多的纹理插值器 - 带旋转的着色器
- C/C++:socket() 创建在循环中失败,打开的文件太多
- 使用Visual Studio在虚幻引擎中创建一个新的类c ++给了我太多的错误
- C++:数组<>初始值设定项太多
- GLib-ERROR:为GWakeup创建管道:打开的文件太多
- C++,从文件读取到结构,然后读取到向量(结构被推入向量太多次,而不仅仅是一次)
- 我会导致太多内存泄漏,以至于我的计算机无响应吗?
- ZeroMq:打开的文件太多.在同一对象上连续增长的fd使用数
- 读取串行命令花费太多时间
- 为什么 Boost unordered_map 在第一次插入时需要太多时间?
- BRK(0) 花费的时间是否太多?
- Valgrind 声称内存释放中的自由空间太多
- 如果分支太多C++
- 压缩太多文件
- 如何在不设置 ulimit -n 的情况下解决套接字程序打开太多文件的错误