C++17中如何将多层嵌套if的多函数调用重构为单if语句?
嵌套if语句重构为单行if的解决方案
现有如下嵌套if代码:
if (GetFlag(...)) { if (auto x = GetX(...)) { if (auto y = GetY(...)) { ... } } }
出于正确性和性能要求,必须严格保证执行顺序:若GetFlag(...)返回false则不调用GetX(...),若x为nullptr则不调用GetY(...)。
能否将其重构为单行if语句?尝试的以下代码可编译但无法保留执行顺序:
if (auto x = GetX(...); auto x = GetX(...) && GetFlag(...)) { ... }
求正确解决方案。
可以利用C++17及以后支持的带初始化器的if语句,结合逻辑与的短路求值特性来实现,既保证单行结构,又严格遵循要求的执行顺序:
if (GetFlag(...) && auto x = GetX(...) && auto y = GetY(...)) { // 原嵌套if内层的逻辑代码 }
执行顺序说明:
- 首先执行
GetFlag(...),若返回false,逻辑与短路,后续GetX(...)和GetY(...)都不会执行; - 若
GetFlag(...)返回true,才会调用GetX(...)并初始化变量x,同时判断x是否非空; - 只有
x非空时,才会调用GetY(...)并初始化变量y,同时判断y是否非空; - 只有以上所有条件都满足时,才会进入if块执行内层逻辑。
如果希望逻辑更清晰,也可以用分号分隔的if初始化语法,同样是单行结构:
if (bool flag = GetFlag(...); flag && auto x = GetX(...) && x && auto y = GetY(...)) { // 原内层逻辑代码 }
这种写法将GetFlag(...)的结果先存入flag变量,后续执行逻辑与第一种写法完全一致,同样能保证短路执行顺序。
内容的提问来源于stack exchange,提问作者devoured elysium
相关产品推荐
相关产品推荐

