我有一个代码,我不想复制太多,它看起来像这样:
myEnum setting;
if (((input == "Enum0") && ((setting = myEnum_0) == setting)) ||
((input == "Enum1") && ((setting = myEnum_1) == setting)) ||
((input == "Enum2") && ((setting = myEnum_2) == setting)))
{
doActionWith(setting);
}
这样我就不必检查输入是否完全不同(如果我刚刚分配了
if (input=="Enum0")
setting = myEnum_0;
代码不知道枚举是否实际设置。
现在我想知道,最后有什么更优雅的解决方案吗?
&& ((setting = myEnum_x) == setting)
?
答案 0 :(得分:2)
我跟这个:
//in the part of the code where you declare myEnum,
//if in a header, you might want to declare this inline
myEnum toMyEnum(const string input){
if(input == "Enum0")
return myEnum_0;
...
return undefinedMyEnum;
}
然后你去
myEnum setting = toMyEnum(input);
if(setting != undefinedMyEnum){
doActionWith(setting);
}
这样,你就有了明确的责任。你只需要一个字符串并将其转换为枚举。你的副作用代码很难阅读,避免这样的"技巧"。
编辑:在第二个想法,现在我的代码产生一个无声错误,这很可能不是那么好。您可能希望将return undefinedMyEnum;
替换为诸如EXIT或抛出错误或适当的断言之类的内容。
答案 1 :(得分:2)
除(setting = myEnum_0) == setting
使用setting
两次而没有sequence point这一事实外,您的代码很难理解。即使您修复了未定义的行为,例如(setting = myEnum_0) == myEnum_0
,您的代码仍然是维护它的任何人的难题。
更好的方法是创建一个辅助函数,并在条件中使用它三次:
if (tryParse(input, "Enum0", setting, Enum0)
|| tryParse(input, "Enum1", setting, Enum1)
|| tryParse(input, "Enum2", setting, Enum2)) {
}
tryParse
定义为成功时返回true
,否则返回false
。
答案 2 :(得分:0)
个性化,我会采用类似Aziuth建议的设计。但如果你想让你保持现有的设计,你可以这样做:
bool doStuff = true;
if (input=="Enum0")
setting = myEnum_0;
else if (input=="Enum1")
setting = myEnum_1;
else if (input=="Enum2")
setting = myEnum_2;
else
{
doStuff = false;
}
if (doStuff)
{
doActionWith(setting);
}