我有多个switch语句
switch(condition1)
{
case 1:
doSomething;
break;
case 2:
doSomething;
break;
default
break;
}--
switch(condition2)
{
case 1:
doSomething;
break;
case 2:
doSomething;
break;
default
break;
}条件可以在未来增加,例如。condition3,condition4,即可以有更多的切换语句。所以我需要可伸缩性。
我想合并这些switch语句。我不想使用太多的if,else条件。在两者之间没有return语句来中断流。无动态内存分配。没有多维数组。
例如:
result = someOperation(condition1, condition2, condition3...)
switch(result)
{
case 1:
doSomething;
break;
case 2:
doSomething;
break;
default
break;
}具体地说,我希望生成多个int的唯一组合。我不想要字符串比较。我更喜欢在某些设计模式中隐藏整个功能(尽管我找不到一个)。
发布于 2015-06-30 17:07:19
条件可以在未来增加,例如。condition3,condition4,即可以有更多的切换语句。所以我需要可伸缩性。
评论:策略模式是可行的,但是我该如何选择策略呢?
请考虑以下内容:
class operation // strategy base
{
public:
virtual bool applies(int result) const = 0;
virtual void perform() = 0;
virtual ~operation() = 0;
};
class first_case: public operation // choose better name than first_case
{
public:
bool applies(int result) const override
{
return result == 1; // equivalent of "case 1:"
}
};
// other cases defined here客户端代码:
void do_stuff()
{
// std::vector<std::unique_ptr<operation>> operations; defined else-where
auto result = someOperation(condition1, condition2, condition3...);
for(auto &op: operations) // equivalent of your switch above
if(op.applies(result))
{
op.perform();
break;
}
}基本上,您将策略选择标准实现为操作基础上的虚拟API (并针对每个操作进行专门化)。
发布于 2015-07-01 16:37:43
如果你需要一些可伸缩的东西,也许你可以实现某种类型的表,按条件结果索引,它存储了一个代表条件结果而被调用的函数的指针。这样,您将获得一些可伸缩的(您可以在运行时动态修改表)和高效的(嗯,不如switch语句高效,但可能足以满足您的目的)
如果您必须为条件添加新的代码(或者最后一段的解决方案效率不够高),最有效的方法是编写一个小程序来为您生成switch语句(也许在适当的位置#include它),并将此生成包含在自动构建过程中。
https://stackoverflow.com/questions/31133260
复制相似问题