C++中解决大量if...else结构方法

如果在代码中出现了大量的if---else if的情况,那么代码的可读性与可维护性会大幅下降。因此,在开发中要避免这种情况的发生。那么有以下的几个方法来解决:

  1. 使用函数指针或者std::function:如果各个分支执行的是不同的函数,可以使用函数指针数组或者std::vector来存储函数指针或者std::function对象。
  2. 使用策略模式:如果每个条件分支都可以看作是一种特定的算法或策略,可以为每种策略定义一个策略类,并在运行时动态选择使用哪一个策略对象。
  3. 使用查找表:对于简单的值到结果的映射,可以使用查找表(如std::mapstd::unordered_map)来代替if-else if
  4. 使用状态模式:如果代码中的条件分支表示不同的状态转换,可以使用状态模式,其中每个状态都是一个对象,状态之间的转换是通过对象之间的交互来完成的。

例如:

使用std::function与查找表的组合,来实现对if...else if结构的解构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <unordered_map>
#include <functional>

int operationAdd(int a, int b) {
return a + b;
}

int operationSubtract(int a, int b) {
return a - b;
}

int operationMultiply(int a, int b) {
return a * b;
}

int main() {
// 初始化查找表
std::unordered_map<char, std::function<int(int, int)>> operations = {
{'+', operationAdd},
{'-', operationSubtract},
{'*', operationMultiply}
};

char op = '*'; // 假设这是用户输入或者某种方式得到的操作符
int a = 5, b = 3;

// 查找表代替if-else if
if (operations.find(op) != operations.end()) {
std::cout << "Result: " << operations[op](a, b) << std::endl;
}
else {
std::cout << "Operation not supported!" << std::endl;
}

return 0;
}