假设我的当前代码是:
if (GetFlag(...)) {
if (auto x = GetX(...)) {
if (auto y = GetY(...)) {
...
}
}
}
,方法调用和变量定义需要按照这个顺序进行,这是为了正确性和性能原因(如果GetFlag(...)
返回false,我们不想计算x
,如果x
是nullptr
,我们不想计算y
)。
是否有办法将其重构为"一行代码"?最接近编译的是
if (auto x = GetX(...); auto x = GetX(...) && GetFlag(...)) { ... }
,但这并不保留操作的顺序。
谢谢!
您可以将条件提取到返回元组的单独函数中,并在if
std::tuple<bool, std::optional<X>, std::optional<Y>> getFlagsXY()
{
if (!getFlags())
{
return { false };
}
if (auto x = getX(); !x)
{
return { true, std::move(x) };
}
else
{
return { true, std::move(x), getY() };
}
}
if (auto [f, x, y] = getFlagsXY(); f && *x && *y) { ... }
是的,这是可能的。If语句一旦看到将要使用哪个分支就停止处理术语。试着改变GetFlag、GetX的值,看看if函数体何时被调用。
#include <iostream>
bool GetFlag()
{
std::cout << "GetFlagn";
return true;
}
int GetX()
{
std::cout << "GetXn";
return 0;
}
int GetY()
{
std::cout << "GetYn";
return 3;
}
int main()
{
int x;
int y;
if (GetFlag() && (x = GetX()) && (y = GetY()))
{
std::cout << "Do " << x << ", " << y;
}
return 0;
}