我有多个切换语句
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语句可以在那里。所以我需要可扩展性。
我想合并这些switch语句。 我不想使用很多if,else条件。 两者之间没有返回声明来打破流量。 没有动态内存分配。 没有多维数组。
例如
result = someOperation(condition1, condition2, condition3...)
switch(result)
{
case 1:
doSomething;
break;
case 2:
doSomething;
break;
default
break;
}
具体来说,我想生成多个整数的唯一组合。 不想要字符串比较。 我更喜欢在某些设计模式中隐藏整个功能(但我无法找到它。)
答案 0 :(得分:1)
未来的条件会增加,例如。 condition3,condition4,即更多的switch语句可以在那里。所以我需要可扩展性。
[评论:]战略模式将起作用,但我将如何选择哪种策略。
考虑一下:
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(并为每个操作专门化它)。
答案 1 :(得分:0)
如果你需要一些可伸缩的东西,也许你可以实现某种表,由条件结果索引,它存储一个指向要代表条件结果调用的函数的指针。通过这种方式,您可以获得可扩展的内容(您可以在运行时动态修改表)并且高效(嗯,不如switch
语句那么高效,但可能足以满足您的需要)
如果您必须为条件添加新代码(或者最后一段解决方案不够有效),最有效的方法是编写一个为您生成switch
语句的小程序(也许#include
它在适当的地方),并将这一代包含在自动构建过程中。