您可以创建一个std::vector
拿着2个函数:一个比较(如同语句头),一个用于动作,如果所述比较函数返回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();
}
}
Live Demo。
,或者,如果所有的这些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();
}
}
Live Demo.
由于所有的函数都在vector
中 - 它们将被迭代,并在完全相同的ord中进行评估呃,因为他们会在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;
}
}
你的问题是什么?分支机构的数量是多少,还是条件的复杂性?如果每个分支都有它的代码,你不会摆脱它们。这不是真正的C++问题,而是软件设计的问题。尝试语义分组和分离代码。如果这是你不喜欢的条件,你可以创建一个封装这些的类。 – Knowleech
'giCompany ==!COMPANY_C'我有一个偷偷摸摸的怀疑,这不符合你的想法。你的意思是'giCompany!= COMPANY_C'? – Borgleader
@Knowleech,他们俩都很难保持...... – wair92