执行switch语句中的所有情况-特定问题
Execute all cases in switch statement - specific issue
如何在不复制大型"一体式"案例的情况下执行switch语句中的所有案例?
例如
switch(obj.nObjType)
{
case eElephant:
...
break;
case eFoo:
...
break;
case eSeptember:
...
break;
default:
return;
}
我希望强制执行所有3种情况(eElephant, eFoo, eSeptember
)的代码,就像没有break;
一样,例如在nObjType = eAllTypes
的情况下。
不能只忽略一个中断。相反,重构代码。
switch(obj.nObjType) {
case eElephant:
pokeElephant();
break;
case eFoo:
barTheFoo();
break;
case eSeptember:
rememberSeptember();
break;
case eAllTypes:
pokeElephant();
barTheFoo();
rememberSeptember();
break;
default:
return;
}
然后使用if
语句:
if (obj.nObjType == eElephant || obj.nObjType == eAllTypes)
{
// Elephant code
}
if (obj.nObjType == eFoo || obj.nObjType == eAllTypes)
{
// Foo code
}
// etc.
这个答案是应该如何完成的。但是:
我看得出来,如果不产生大量的问题,很难找到正确的解决方案的代码行。谢谢@TobiMcNamobi,但在我的开关里有大约200个案例,因此为每个案例创建一个函数不是一个好主意。我认为,最好的办法是(不幸的是)在大的。因为,我想,如果其他方法的效率要低得多,那么switch语句?
在如此多的情况下(你到底在做什么?),即使是提取方法也会在switch语句的主体中留下200个额外的函数调用。这可能会变得很难快速维护。
在这种的情况下,我会做以下操作:
switch(enum_variable)
{
case e_all:
case e_1:
e_1_function();
if(enum_variable != e_all){break;} //**
case e_2:
e_2_function();
if(enum_variable != e_all){break;} //**
//...
default:
break;
}
标记为//**
的线在不执行所有情况时都会断开。它实现起来很快(可以通过搜索和替换break;
来完成,这为您加快了速度),并且可以随心所欲
话虽如此,这仍然是一种非常糟糕的方式,但有时确实需要例外。
但是,我建议您不要将其作为将来使用的样式。你可能会发现,通过重新思考项目的工作流程,你可以做得更好,因为这可能会让你简化和改进。当然,我们不知道你在做什么,所以我不能提供更多的建议。
如果将switch语句放在函数中,并使obj
具有标志列表而不是标志,则可以使用switch语句为列表中的每个标志调用函数。伪:
void dostuff(flag)
switch(flag) {
// ...
}
}
for (auto flag in obj.flags) {
dostuff(flag)
}
相关文章:
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- 如何在不使用额外空间的情况下解决这个问题?
- 如何解决在负数的情况下程序以相同方式工作的问题?
- C++复杂情况的比较器通过参数问题
- 我如何处理这种情况C++大小问题
- 为什么在某些情况下,我在这个问题上会得到TLE?
- 在以下情况下会出现什么问题?
- 程序在没有输入的情况下退出,它有基本的,驱动的类属性初始化问题
- 在没有宏的情况下在 C++98 中创建类型列表时遇到问题
- 如何在不产生 JNI 问题的情况下转换 byte[] -> uint8_t[]?
- 错误:在没有参数列表的情况下无效使用模板名称“ExTree” ||如果解决这个问题怎么办?(初学者)
- enable_if和多种情况的问题
- C++ 标准库堆栈使用情况.推送浮点数组时出现问题
- 在任何情况下都会出现意外输出.我的解决方案出了什么问题
- 在不使用动态数组的情况下初始化数组时出现问题
- 在没有参数的情况下调用构造函数时生成随机数的问题
- getchar 有什么问题(因为程序在没有检查的情况下退出循环)
- 执行switch语句中的所有情况-特定问题
- 问题:只有在没有拖放的情况下才接受mouseRelease