if子句中的条件赋值

时间:2017-06-07 10:54:13

标签: c++ if-statement

我有一个代码,我不想复制太多,它看起来像这样:

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)

3 个答案:

答案 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);
}