if子句中的有条件分配
Conditional assignment in if clause
我有一个我不想重复太多的代码,看起来像这样:
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)
?
除了(setting = myEnum_0) == setting
使用setting
两次没有A 序列点的事实之外,您的代码很难理解。即使您修复了不确定的行为,例如(setting = myEnum_0) == myEnum_0
,您的代码仍然是维护它的任何人的难题。
一种更好的方法是制作辅助功能,并在条件下使用三次:
if (tryParse(input, "Enum0", setting, Enum0)
|| tryParse(input, "Enum1", setting, Enum1)
|| tryParse(input, "Enum2", setting, Enum2)) {
}
用tryParse
定义为成功返回true
,否则false
否则。
我会选择:
//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;
。
个性化,我会喜欢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);
}
相关文章:
- 如何使用 soong 命名空间来有条件地编译模块
- 有条件地将默认参数传递给函数(使用"?"运算符)
- 根据模板类型有条件地删除变量
- 有条件地选择带有 decltype() 和三元运算符的类型
- 如何使用 SFINAE 在方法调用中有条件地定义变量?
- 有条件的打印和计数在 std::map 上有限制
- 如何在 c++ 中有条件地包含标头?
- 如何仅在Qt是用ltcg构建时才有条件地启用ltcg?
- 如何在Visual Studio 2019中有条件地编译c++源文件
- C++可以有条件地向下转换类指针吗
- 使用 SFINAE 有条件地解析分配器成员
- 有条件地删除宏
- 有条件地包含C++标准库
- 无法使用三元运算符有条件地分配"istream &"?
- if子句中的有条件分配
- 当直接分配时,为什么此功能指针分配起作用,而不是与有条件的操作员一起使用
- 有条件地分配 std::string 作为引用
- 有条件的分配使用时
- 有条件地分配引用
- 我可以有条件地选择分配给哪个变量吗